Revision d537cf6c hw/sparc32_dma.c

b/hw/sparc32_dma.c
37 37
#ifdef DEBUG_DMA
38 38
#define DPRINTF(fmt, args...) \
39 39
do { printf("DMA: " fmt , ##args); } while (0)
40
#define pic_set_irq_new(ctl, irq, level)                                \
41
    do { printf("DMA: set_irq(%d): %d\n", (irq), (level));              \
42
        pic_set_irq_new((ctl), (irq),(level));} while (0)
43 40
#else
44 41
#define DPRINTF(fmt, args...)
45 42
#endif
......
58 55

  
59 56
struct DMAState {
60 57
    uint32_t dmaregs[DMA_REGS];
61
    int espirq, leirq;
62
    void *iommu, *esp_opaque, *lance_opaque, *intctl;
58
    qemu_irq espirq, leirq;
59
    void *iommu, *esp_opaque, *lance_opaque;
60
    qemu_irq *pic;
63 61
};
64 62

  
65
void ledma_set_irq(void *opaque, int isr)
66
{
67
    DMAState *s = opaque;
68

  
69
    pic_set_irq_new(s->intctl, s->leirq, isr);
70
}
71

  
72 63
/* Note: on sparc, the lance 16 bit bus is swapped */
73 64
void ledma_memory_read(void *opaque, target_phys_addr_t addr, 
74 65
                       uint8_t *buf, int len, int do_bswap)
......
125 116
{
126 117
    DMAState *s = opaque;
127 118

  
119
    DPRINTF("Raise ESP IRQ\n");
128 120
    s->dmaregs[0] |= DMA_INTR;
129
    pic_set_irq_new(s->intctl, s->espirq, 1);
121
    qemu_irq_raise(s->espirq);
130 122
}
131 123

  
132 124
void espdma_clear_irq(void *opaque)
......
134 126
    DMAState *s = opaque;
135 127

  
136 128
    s->dmaregs[0] &= ~DMA_INTR;
137
    pic_set_irq_new(s->intctl, s->espirq, 0);
129
    DPRINTF("Lower ESP IRQ\n");
130
    qemu_irq_lower(s->espirq);
138 131
}
139 132

  
140 133
void espdma_memory_read(void *opaque, uint8_t *buf, int len)
......
179 172
    DPRINTF("write dmareg[%d]: 0x%8.8x -> 0x%8.8x\n", saddr, s->dmaregs[saddr], val);
180 173
    switch (saddr) {
181 174
    case 0:
182
        if (!(val & DMA_INTREN))
183
            pic_set_irq_new(s->intctl, s->espirq, 0);
175
        if (!(val & DMA_INTREN)) {
176
            DPRINTF("Lower ESP IRQ\n");
177
            qemu_irq_lower(s->espirq);
178
        }
184 179
        if (val & DMA_RESET) {
185 180
            esp_reset(s->esp_opaque);
186 181
        } else if (val & 0x40) {
......
194 189
        s->dmaregs[0] |= DMA_LOADED;
195 190
        break;
196 191
    case 4:
197
        if (!(val & DMA_INTREN))
198
            pic_set_irq_new(s->intctl, s->leirq, 0);
192
        /* ??? Should this mask out the lance IRQ?  The NIC may re-assert
193
           this IRQ unexpectedly.  */
194
        if (!(val & DMA_INTREN)) {
195
            DPRINTF("Lower Lance IRQ\n");
196
            qemu_irq_lower(s->leirq);
197
        }
199 198
        if (val & DMA_RESET)
200 199
            pcnet_h_reset(s->lance_opaque);
201 200
        val &= 0x0fffffff;
......
250 249
    return 0;
251 250
}
252 251

  
253
void *sparc32_dma_init(uint32_t daddr, int espirq, int leirq, void *iommu, void *intctl)
252
void *sparc32_dma_init(uint32_t daddr, qemu_irq espirq, qemu_irq leirq,
253
                       void *iommu)
254 254
{
255 255
    DMAState *s;
256 256
    int dma_io_memory;
......
262 262
    s->espirq = espirq;
263 263
    s->leirq = leirq;
264 264
    s->iommu = iommu;
265
    s->intctl = intctl;
266 265

  
267 266
    dma_io_memory = cpu_register_io_memory(0, dma_mem_read, dma_mem_write, s);
268 267
    cpu_register_physical_memory(daddr, 16 * 2, dma_io_memory);

Also available in: Unified diff