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