Revision b25cf589

b/hw/lsi53c895a.c
143 143
#define LSI_CCNTL0_PMJCTL 0x40
144 144
#define LSI_CCNTL0_ENPMJ  0x80
145 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

  
146 154
#define PHASE_DO          0
147 155
#define PHASE_DI          1
148 156
#define PHASE_CMD         2
......
323 331
    s->csbc = 0;
324 332
}
325 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

  
326 341
static uint8_t lsi_reg_readb(LSIState *s, int offset);
327 342
static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val);
328 343
static void lsi_execute_script(LSIState *s);
......
449 464
static void lsi_do_dma(LSIState *s, int out)
450 465
{
451 466
    uint32_t count;
452
    uint32_t addr;
467
    target_phys_addr_t addr;
453 468

  
454 469
    if (!s->current_dma_len) {
455 470
        /* Wait until data is available.  */
......
460 475
    count = s->dbc;
461 476
    if (count > s->current_dma_len)
462 477
        count = s->current_dma_len;
463
    DPRINTF("DMA addr=0x%08x len=%d\n", s->dnad, count);
464 478

  
465 479
    addr = s->dnad;
480
    if (lsi_dma_40bit(s))
481
        addr |= ((uint64_t)s->dnad64 << 32);
482
    else if (s->sbms)
483
        addr |= ((uint64_t)s->sbms << 32);
484

  
485
    DPRINTF("DMA addr=0x%" TARGET_FMT_plx " len=%d\n", addr, count);
466 486
    s->csbc += count;
467 487
    s->dnad += count;
468 488
    s->dbc -= count;
......
839 859
static void lsi_execute_script(LSIState *s)
840 860
{
841 861
    uint32_t insn;
842
    uint32_t addr;
862
    uint32_t addr, addr_high;
843 863
    int opcode;
844 864
    int insn_processed = 0;
845 865

  
......
848 868
    insn_processed++;
849 869
    insn = read_dword(s, s->dsp);
850 870
    addr = read_dword(s, s->dsp + 4);
871
    addr_high = 0;
851 872
    DPRINTF("SCRIPTS dsp=%08x opcode %08x arg %08x\n", s->dsp, insn, addr);
852 873
    s->dsps = addr;
853 874
    s->dcmd = insn >> 24;
......
870 891
            /* Table indirect addressing.  */
871 892
            offset = sxt24(addr);
872 893
            cpu_physical_memory_read(s->dsa + offset, (uint8_t *)buf, 8);
873
            s->dbc = cpu_to_le32(buf[0]);
894
            /* byte count is stored in bits 0:23 only */
895
            s->dbc = cpu_to_le32(buf[0]) & 0xffffff;
874 896
            s->rbc = s->dbc;
875 897
            addr = cpu_to_le32(buf[1]);
898

  
899
            /* 40-bit DMA, upper addr bits [39:32] stored in first DWORD of
900
             * table, bits [31:24] */
901
            if (lsi_dma_40bit(s))
902
                addr_high = cpu_to_le32(buf[0]) >> 24;
876 903
        }
877 904
        if ((s->sstat1 & PHASE_MASK) != ((insn >> 24) & 7)) {
878 905
            DPRINTF("Wrong phase got %d expected %d\n",
......
881 908
            break;
882 909
        }
883 910
        s->dnad = addr;
911
        s->dnad64 = addr_high;
884 912
        /* ??? Set ESA.  */
885 913
        s->ia = s->dsp - 8;
886 914
        switch (s->sstat1 & 0x7) {

Also available in: Unified diff