Commit 70c0de96a3ed38d9e9a67bddea0f35a871aac095
1 parent
2bc1abb7
Use qemu_irqs between dma controllers and esp, lance
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2873 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
37 additions
and
42 deletions
hw/esp.c
@@ -51,6 +51,7 @@ do { printf("ESP: " fmt , ##args); } while (0) | @@ -51,6 +51,7 @@ do { printf("ESP: " fmt , ##args); } while (0) | ||
51 | typedef struct ESPState ESPState; | 51 | typedef struct ESPState ESPState; |
52 | 52 | ||
53 | struct ESPState { | 53 | struct ESPState { |
54 | + qemu_irq irq; | ||
54 | BlockDriverState **bd; | 55 | BlockDriverState **bd; |
55 | uint8_t rregs[ESP_REGS]; | 56 | uint8_t rregs[ESP_REGS]; |
56 | uint8_t wregs[ESP_REGS]; | 57 | uint8_t wregs[ESP_REGS]; |
@@ -126,7 +127,7 @@ static int get_cmd(ESPState *s, uint8_t *buf) | @@ -126,7 +127,7 @@ static int get_cmd(ESPState *s, uint8_t *buf) | ||
126 | s->rregs[4] = STAT_IN; | 127 | s->rregs[4] = STAT_IN; |
127 | s->rregs[5] = INTR_DC; | 128 | s->rregs[5] = INTR_DC; |
128 | s->rregs[6] = SEQ_0; | 129 | s->rregs[6] = SEQ_0; |
129 | - espdma_raise_irq(s->dma_opaque); | 130 | + qemu_irq_raise(s->irq); |
130 | return 0; | 131 | return 0; |
131 | } | 132 | } |
132 | s->current_dev = s->scsi_dev[target]; | 133 | s->current_dev = s->scsi_dev[target]; |
@@ -156,7 +157,7 @@ static void do_cmd(ESPState *s, uint8_t *buf) | @@ -156,7 +157,7 @@ static void do_cmd(ESPState *s, uint8_t *buf) | ||
156 | } | 157 | } |
157 | s->rregs[5] = INTR_BS | INTR_FC; | 158 | s->rregs[5] = INTR_BS | INTR_FC; |
158 | s->rregs[6] = SEQ_CD; | 159 | s->rregs[6] = SEQ_CD; |
159 | - espdma_raise_irq(s->dma_opaque); | 160 | + qemu_irq_raise(s->irq); |
160 | } | 161 | } |
161 | 162 | ||
162 | static void handle_satn(ESPState *s) | 163 | static void handle_satn(ESPState *s) |
@@ -178,7 +179,7 @@ static void handle_satn_stop(ESPState *s) | @@ -178,7 +179,7 @@ static void handle_satn_stop(ESPState *s) | ||
178 | s->rregs[4] = STAT_IN | STAT_TC | STAT_CD; | 179 | s->rregs[4] = STAT_IN | STAT_TC | STAT_CD; |
179 | s->rregs[5] = INTR_BS | INTR_FC; | 180 | s->rregs[5] = INTR_BS | INTR_FC; |
180 | s->rregs[6] = SEQ_CD; | 181 | s->rregs[6] = SEQ_CD; |
181 | - espdma_raise_irq(s->dma_opaque); | 182 | + qemu_irq_raise(s->irq); |
182 | } | 183 | } |
183 | } | 184 | } |
184 | 185 | ||
@@ -198,7 +199,7 @@ static void write_response(ESPState *s) | @@ -198,7 +199,7 @@ static void write_response(ESPState *s) | ||
198 | s->ti_wptr = 0; | 199 | s->ti_wptr = 0; |
199 | s->rregs[7] = 2; | 200 | s->rregs[7] = 2; |
200 | } | 201 | } |
201 | - espdma_raise_irq(s->dma_opaque); | 202 | + qemu_irq_raise(s->irq); |
202 | } | 203 | } |
203 | 204 | ||
204 | static void esp_dma_done(ESPState *s) | 205 | static void esp_dma_done(ESPState *s) |
@@ -209,7 +210,7 @@ static void esp_dma_done(ESPState *s) | @@ -209,7 +210,7 @@ static void esp_dma_done(ESPState *s) | ||
209 | s->rregs[7] = 0; | 210 | s->rregs[7] = 0; |
210 | s->rregs[0] = 0; | 211 | s->rregs[0] = 0; |
211 | s->rregs[1] = 0; | 212 | s->rregs[1] = 0; |
212 | - espdma_raise_irq(s->dma_opaque); | 213 | + qemu_irq_raise(s->irq); |
213 | } | 214 | } |
214 | 215 | ||
215 | static void esp_do_dma(ESPState *s) | 216 | static void esp_do_dma(ESPState *s) |
@@ -362,7 +363,7 @@ static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) | @@ -362,7 +363,7 @@ static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) | ||
362 | } else { | 363 | } else { |
363 | s->rregs[2] = s->ti_buf[s->ti_rptr++]; | 364 | s->rregs[2] = s->ti_buf[s->ti_rptr++]; |
364 | } | 365 | } |
365 | - espdma_raise_irq(s->dma_opaque); | 366 | + qemu_irq_raise(s->irq); |
366 | } | 367 | } |
367 | if (s->ti_size == 0) { | 368 | if (s->ti_size == 0) { |
368 | s->ti_rptr = 0; | 369 | s->ti_rptr = 0; |
@@ -373,7 +374,7 @@ static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) | @@ -373,7 +374,7 @@ static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) | ||
373 | // interrupt | 374 | // interrupt |
374 | // Clear interrupt/error status bits | 375 | // Clear interrupt/error status bits |
375 | s->rregs[4] &= ~(STAT_IN | STAT_GE | STAT_PE); | 376 | s->rregs[4] &= ~(STAT_IN | STAT_GE | STAT_PE); |
376 | - espdma_clear_irq(s->dma_opaque); | 377 | + qemu_irq_lower(s->irq); |
377 | break; | 378 | break; |
378 | default: | 379 | default: |
379 | break; | 380 | break; |
@@ -436,7 +437,7 @@ static void esp_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | @@ -436,7 +437,7 @@ static void esp_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | ||
436 | DPRINTF("Bus reset (%2.2x)\n", val); | 437 | DPRINTF("Bus reset (%2.2x)\n", val); |
437 | s->rregs[5] = INTR_RST; | 438 | s->rregs[5] = INTR_RST; |
438 | if (!(s->wregs[8] & 0x40)) { | 439 | if (!(s->wregs[8] & 0x40)) { |
439 | - espdma_raise_irq(s->dma_opaque); | 440 | + qemu_irq_raise(s->irq); |
440 | } | 441 | } |
441 | break; | 442 | break; |
442 | case 0x10: | 443 | case 0x10: |
@@ -565,7 +566,7 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) | @@ -565,7 +566,7 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) | ||
565 | } | 566 | } |
566 | 567 | ||
567 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | 568 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
568 | - void *dma_opaque) | 569 | + void *dma_opaque, qemu_irq irq) |
569 | { | 570 | { |
570 | ESPState *s; | 571 | ESPState *s; |
571 | int esp_io_memory; | 572 | int esp_io_memory; |
@@ -575,6 +576,7 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | @@ -575,6 +576,7 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | ||
575 | return NULL; | 576 | return NULL; |
576 | 577 | ||
577 | s->bd = bd; | 578 | s->bd = bd; |
579 | + s->irq = irq; | ||
578 | s->dma_opaque = dma_opaque; | 580 | s->dma_opaque = dma_opaque; |
579 | sparc32_dma_set_reset_data(dma_opaque, esp_reset, s); | 581 | sparc32_dma_set_reset_data(dma_opaque, esp_reset, s); |
580 | 582 |
hw/pcnet.c
@@ -2018,7 +2018,7 @@ static CPUWriteMemoryFunc *lance_mem_write[3] = { | @@ -2018,7 +2018,7 @@ static CPUWriteMemoryFunc *lance_mem_write[3] = { | ||
2018 | (CPUWriteMemoryFunc *)&pcnet_ioport_writew, | 2018 | (CPUWriteMemoryFunc *)&pcnet_ioport_writew, |
2019 | }; | 2019 | }; |
2020 | 2020 | ||
2021 | -void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | 2021 | +void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, |
2022 | qemu_irq irq) | 2022 | qemu_irq irq) |
2023 | { | 2023 | { |
2024 | PCNetState *d; | 2024 | PCNetState *d; |
@@ -2026,7 +2026,7 @@ void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | @@ -2026,7 +2026,7 @@ void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | ||
2026 | 2026 | ||
2027 | d = qemu_mallocz(sizeof(PCNetState)); | 2027 | d = qemu_mallocz(sizeof(PCNetState)); |
2028 | if (!d) | 2028 | if (!d) |
2029 | - return NULL; | 2029 | + return; |
2030 | 2030 | ||
2031 | lance_io_memory = | 2031 | lance_io_memory = |
2032 | cpu_register_io_memory(0, lance_mem_read, lance_mem_write, d); | 2032 | cpu_register_io_memory(0, lance_mem_read, lance_mem_write, d); |
@@ -2041,7 +2041,5 @@ void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | @@ -2041,7 +2041,5 @@ void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | ||
2041 | d->phys_mem_write = ledma_memory_write; | 2041 | d->phys_mem_write = ledma_memory_write; |
2042 | 2042 | ||
2043 | pcnet_common_init(d, nd, "lance"); | 2043 | pcnet_common_init(d, nd, "lance"); |
2044 | - | ||
2045 | - return d; | ||
2046 | } | 2044 | } |
2047 | #endif /* TARGET_SPARC */ | 2045 | #endif /* TARGET_SPARC */ |
hw/sparc32_dma.c
@@ -115,22 +115,18 @@ void ledma_memory_write(void *opaque, target_phys_addr_t addr, | @@ -115,22 +115,18 @@ void ledma_memory_write(void *opaque, target_phys_addr_t addr, | ||
115 | } | 115 | } |
116 | } | 116 | } |
117 | 117 | ||
118 | -void espdma_raise_irq(void *opaque) | 118 | +static void dma_set_irq(void *opaque, int irq, int level) |
119 | { | 119 | { |
120 | DMAState *s = opaque; | 120 | DMAState *s = opaque; |
121 | - | ||
122 | - DPRINTF("Raise ESP IRQ\n"); | ||
123 | - s->dmaregs[0] |= DMA_INTR; | ||
124 | - qemu_irq_raise(s->irq); | ||
125 | -} | ||
126 | - | ||
127 | -void espdma_clear_irq(void *opaque) | ||
128 | -{ | ||
129 | - DMAState *s = opaque; | ||
130 | - | ||
131 | - s->dmaregs[0] &= ~DMA_INTR; | ||
132 | - DPRINTF("Lower ESP IRQ\n"); | ||
133 | - qemu_irq_lower(s->irq); | 121 | + if (level) { |
122 | + DPRINTF("Raise ESP IRQ\n"); | ||
123 | + s->dmaregs[0] |= DMA_INTR; | ||
124 | + qemu_irq_raise(s->irq); | ||
125 | + } else { | ||
126 | + s->dmaregs[0] &= ~DMA_INTR; | ||
127 | + DPRINTF("Lower ESP IRQ\n"); | ||
128 | + qemu_irq_lower(s->irq); | ||
129 | + } | ||
134 | } | 130 | } |
135 | 131 | ||
136 | void espdma_memory_read(void *opaque, uint8_t *buf, int len) | 132 | void espdma_memory_read(void *opaque, uint8_t *buf, int len) |
@@ -241,7 +237,8 @@ static int dma_load(QEMUFile *f, void *opaque, int version_id) | @@ -241,7 +237,8 @@ static int dma_load(QEMUFile *f, void *opaque, int version_id) | ||
241 | return 0; | 237 | return 0; |
242 | } | 238 | } |
243 | 239 | ||
244 | -void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu) | 240 | +void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, |
241 | + void *iommu, qemu_irq **dev_irq) | ||
245 | { | 242 | { |
246 | DMAState *s; | 243 | DMAState *s; |
247 | int dma_io_memory; | 244 | int dma_io_memory; |
@@ -250,7 +247,7 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu) | @@ -250,7 +247,7 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu) | ||
250 | if (!s) | 247 | if (!s) |
251 | return NULL; | 248 | return NULL; |
252 | 249 | ||
253 | - s->irq = irq; | 250 | + s->irq = parent_irq; |
254 | s->iommu = iommu; | 251 | s->iommu = iommu; |
255 | 252 | ||
256 | dma_io_memory = cpu_register_io_memory(0, dma_mem_read, dma_mem_write, s); | 253 | dma_io_memory = cpu_register_io_memory(0, dma_mem_read, dma_mem_write, s); |
@@ -258,6 +255,7 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu) | @@ -258,6 +255,7 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu) | ||
258 | 255 | ||
259 | register_savevm("sparc32_dma", daddr, 2, dma_save, dma_load, s); | 256 | register_savevm("sparc32_dma", daddr, 2, dma_save, dma_load, s); |
260 | qemu_register_reset(dma_reset, s); | 257 | qemu_register_reset(dma_reset, s); |
258 | + *dev_irq = qemu_allocate_irqs(dma_set_irq, s, 1); | ||
261 | 259 | ||
262 | return s; | 260 | return s; |
263 | } | 261 | } |
hw/sun4m.c
@@ -262,9 +262,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | @@ -262,9 +262,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | ||
262 | { | 262 | { |
263 | CPUState *env, *envs[MAX_CPUS]; | 263 | CPUState *env, *envs[MAX_CPUS]; |
264 | unsigned int i; | 264 | unsigned int i; |
265 | - void *iommu, *espdma, *ledma, *main_esp, *main_lance = NULL; | 265 | + void *iommu, *espdma, *ledma, *main_esp; |
266 | const sparc_def_t *def; | 266 | const sparc_def_t *def; |
267 | - qemu_irq *slavio_irq; | 267 | + qemu_irq *slavio_irq, *espdma_irq, *ledma_irq; |
268 | 268 | ||
269 | /* init CPUs */ | 269 | /* init CPUs */ |
270 | sparc_find_by_name(cpu_model, &def); | 270 | sparc_find_by_name(cpu_model, &def); |
@@ -296,9 +296,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | @@ -296,9 +296,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | ||
296 | slavio_intctl_set_cpu(slavio_intctl, i, envs[i]); | 296 | slavio_intctl_set_cpu(slavio_intctl, i, envs[i]); |
297 | } | 297 | } |
298 | espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], | 298 | espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], |
299 | - iommu); | 299 | + iommu, &espdma_irq); |
300 | ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, | 300 | ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, |
301 | - slavio_irq[hwdef->le_irq], iommu); | 301 | + slavio_irq[hwdef->le_irq], iommu, &ledma_irq); |
302 | 302 | ||
303 | if (graphic_depth != 8 && graphic_depth != 24) { | 303 | if (graphic_depth != 8 && graphic_depth != 24) { |
304 | fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth); | 304 | fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth); |
@@ -309,8 +309,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | @@ -309,8 +309,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | ||
309 | if (nd_table[0].vlan) { | 309 | if (nd_table[0].vlan) { |
310 | if (nd_table[0].model == NULL | 310 | if (nd_table[0].model == NULL |
311 | || strcmp(nd_table[0].model, "lance") == 0) { | 311 | || strcmp(nd_table[0].model, "lance") == 0) { |
312 | - main_lance = lance_init(&nd_table[0], hwdef->le_base, ledma, | ||
313 | - slavio_irq[hwdef->le_irq]); | 312 | + lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq); |
314 | } else { | 313 | } else { |
315 | fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model); | 314 | fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model); |
316 | exit (1); | 315 | exit (1); |
@@ -331,7 +330,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | @@ -331,7 +330,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | ||
331 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], | 330 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
332 | serial_hds[1], serial_hds[0]); | 331 | serial_hds[1], serial_hds[0]); |
333 | fdctrl_init(slavio_irq[hwdef->fd_irq], 0, 1, hwdef->fd_base, fd_table); | 332 | fdctrl_init(slavio_irq[hwdef->fd_irq], 0, 1, hwdef->fd_base, fd_table); |
334 | - main_esp = esp_init(bs_table, hwdef->esp_base, espdma); | 333 | + main_esp = esp_init(bs_table, hwdef->esp_base, espdma, *espdma_irq); |
335 | 334 | ||
336 | for (i = 0; i < MAX_DISKS; i++) { | 335 | for (i = 0; i < MAX_DISKS; i++) { |
337 | if (bs_table[i]) { | 336 | if (bs_table[i]) { |
vl.h
@@ -1046,7 +1046,7 @@ void pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn); | @@ -1046,7 +1046,7 @@ void pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn); | ||
1046 | /* pcnet.c */ | 1046 | /* pcnet.c */ |
1047 | 1047 | ||
1048 | void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn); | 1048 | void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn); |
1049 | -void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | 1049 | +void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, |
1050 | qemu_irq irq); | 1050 | qemu_irq irq); |
1051 | 1051 | ||
1052 | /* vmmouse.c */ | 1052 | /* vmmouse.c */ |
@@ -1263,17 +1263,15 @@ void slavio_set_power_fail(void *opaque, int power_failing); | @@ -1263,17 +1263,15 @@ void slavio_set_power_fail(void *opaque, int power_failing); | ||
1263 | /* esp.c */ | 1263 | /* esp.c */ |
1264 | void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); | 1264 | void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); |
1265 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | 1265 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
1266 | - void *dma_opaque); | 1266 | + void *dma_opaque, qemu_irq irq); |
1267 | 1267 | ||
1268 | /* sparc32_dma.c */ | 1268 | /* sparc32_dma.c */ |
1269 | -void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu); | ||
1270 | -void ledma_set_irq(void *opaque, int isr); | 1269 | +void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, |
1270 | + void *iommu, qemu_irq **dev_irq); | ||
1271 | void ledma_memory_read(void *opaque, target_phys_addr_t addr, | 1271 | void ledma_memory_read(void *opaque, target_phys_addr_t addr, |
1272 | uint8_t *buf, int len, int do_bswap); | 1272 | uint8_t *buf, int len, int do_bswap); |
1273 | void ledma_memory_write(void *opaque, target_phys_addr_t addr, | 1273 | void ledma_memory_write(void *opaque, target_phys_addr_t addr, |
1274 | uint8_t *buf, int len, int do_bswap); | 1274 | uint8_t *buf, int len, int do_bswap); |
1275 | -void espdma_raise_irq(void *opaque); | ||
1276 | -void espdma_clear_irq(void *opaque); | ||
1277 | void espdma_memory_read(void *opaque, uint8_t *buf, int len); | 1275 | void espdma_memory_read(void *opaque, uint8_t *buf, int len); |
1278 | void espdma_memory_write(void *opaque, uint8_t *buf, int len); | 1276 | void espdma_memory_write(void *opaque, uint8_t *buf, int len); |
1279 | void sparc32_dma_set_reset_data(void *opaque, void (*dev_reset)(void *opaque), | 1277 | void sparc32_dma_set_reset_data(void *opaque, void (*dev_reset)(void *opaque), |