Commit 2d069bab6ad7f8c74e49715f7c534e8e799c9855
1 parent
52da07d1
Use qemu_irq for a reset signal between DMA and ESP/Lance
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3120 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
37 additions
and
26 deletions
hw/esp.c
... | ... | @@ -344,6 +344,12 @@ static void esp_reset(void *opaque) |
344 | 344 | s->do_cmd = 0; |
345 | 345 | } |
346 | 346 | |
347 | +static void parent_esp_reset(void *opaque, int irq, int level) | |
348 | +{ | |
349 | + if (level) | |
350 | + esp_reset(opaque); | |
351 | +} | |
352 | + | |
347 | 353 | static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) |
348 | 354 | { |
349 | 355 | ESPState *s = opaque; |
... | ... | @@ -569,7 +575,7 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) |
569 | 575 | } |
570 | 576 | |
571 | 577 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
572 | - void *dma_opaque, qemu_irq irq) | |
578 | + void *dma_opaque, qemu_irq irq, qemu_irq *reset) | |
573 | 579 | { |
574 | 580 | ESPState *s; |
575 | 581 | int esp_io_memory; |
... | ... | @@ -581,7 +587,6 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
581 | 587 | s->bd = bd; |
582 | 588 | s->irq = irq; |
583 | 589 | s->dma_opaque = dma_opaque; |
584 | - sparc32_dma_set_reset_data(dma_opaque, esp_reset, s); | |
585 | 590 | |
586 | 591 | esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s); |
587 | 592 | cpu_register_physical_memory(espaddr, ESP_SIZE, esp_io_memory); |
... | ... | @@ -591,5 +596,7 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
591 | 596 | register_savevm("esp", espaddr, 3, esp_save, esp_load, s); |
592 | 597 | qemu_register_reset(esp_reset, s); |
593 | 598 | |
599 | + *reset = *qemu_allocate_irqs(parent_esp_reset, s, 1); | |
600 | + | |
594 | 601 | return s; |
595 | 602 | } | ... | ... |
hw/pcnet.c
... | ... | @@ -2011,6 +2011,12 @@ void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn) |
2011 | 2011 | |
2012 | 2012 | #if defined (TARGET_SPARC) && !defined(TARGET_SPARC64) // Avoid compile failure |
2013 | 2013 | |
2014 | +static void parent_lance_reset(void *opaque, int irq, int level) | |
2015 | +{ | |
2016 | + if (level) | |
2017 | + pcnet_h_reset(opaque); | |
2018 | +} | |
2019 | + | |
2014 | 2020 | static void lance_mem_writew(void *opaque, target_phys_addr_t addr, |
2015 | 2021 | uint32_t val) |
2016 | 2022 | { |
... | ... | @@ -2047,7 +2053,7 @@ static CPUWriteMemoryFunc *lance_mem_write[3] = { |
2047 | 2053 | }; |
2048 | 2054 | |
2049 | 2055 | void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, |
2050 | - qemu_irq irq) | |
2056 | + qemu_irq irq, qemu_irq *reset) | |
2051 | 2057 | { |
2052 | 2058 | PCNetState *d; |
2053 | 2059 | int lance_io_memory; |
... | ... | @@ -2060,7 +2066,8 @@ void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, |
2060 | 2066 | cpu_register_io_memory(0, lance_mem_read, lance_mem_write, d); |
2061 | 2067 | |
2062 | 2068 | d->dma_opaque = dma_opaque; |
2063 | - sparc32_dma_set_reset_data(dma_opaque, pcnet_h_reset, d); | |
2069 | + | |
2070 | + *reset = *qemu_allocate_irqs(parent_lance_reset, d, 1); | |
2064 | 2071 | |
2065 | 2072 | cpu_register_physical_memory(leaddr, 4, lance_io_memory); |
2066 | 2073 | ... | ... |
hw/sparc32_dma.c
... | ... | @@ -58,9 +58,9 @@ typedef struct DMAState DMAState; |
58 | 58 | struct DMAState { |
59 | 59 | uint32_t dmaregs[DMA_REGS]; |
60 | 60 | qemu_irq irq; |
61 | - void *iommu, *dev_opaque; | |
62 | - void (*dev_reset)(void *dev_opaque); | |
61 | + void *iommu; | |
63 | 62 | qemu_irq *pic; |
63 | + qemu_irq dev_reset; | |
64 | 64 | }; |
65 | 65 | |
66 | 66 | /* Note: on sparc, the lance 16 bit bus is swapped */ |
... | ... | @@ -178,7 +178,8 @@ static void dma_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) |
178 | 178 | qemu_irq_lower(s->irq); |
179 | 179 | } |
180 | 180 | if (val & DMA_RESET) { |
181 | - s->dev_reset(s->dev_opaque); | |
181 | + qemu_irq_raise(s->dev_reset); | |
182 | + qemu_irq_lower(s->dev_reset); | |
182 | 183 | } else if (val & DMA_DRAIN_FIFO) { |
183 | 184 | val &= ~DMA_DRAIN_FIFO; |
184 | 185 | } else if (val == 0) |
... | ... | @@ -238,7 +239,7 @@ static int dma_load(QEMUFile *f, void *opaque, int version_id) |
238 | 239 | } |
239 | 240 | |
240 | 241 | void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, |
241 | - void *iommu, qemu_irq **dev_irq) | |
242 | + void *iommu, qemu_irq **dev_irq, qemu_irq **reset) | |
242 | 243 | { |
243 | 244 | DMAState *s; |
244 | 245 | int dma_io_memory; |
... | ... | @@ -257,14 +258,7 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, |
257 | 258 | qemu_register_reset(dma_reset, s); |
258 | 259 | *dev_irq = qemu_allocate_irqs(dma_set_irq, s, 1); |
259 | 260 | |
260 | - return s; | |
261 | -} | |
262 | - | |
263 | -void sparc32_dma_set_reset_data(void *opaque, void (*dev_reset)(void *opaque), | |
264 | - void *dev_opaque) | |
265 | -{ | |
266 | - DMAState *s = opaque; | |
261 | + *reset = &s->dev_reset; | |
267 | 262 | |
268 | - s->dev_reset = dev_reset; | |
269 | - s->dev_opaque = dev_opaque; | |
263 | + return s; | |
270 | 264 | } | ... | ... |
hw/sun4m.c
... | ... | @@ -315,6 +315,7 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, |
315 | 315 | const sparc_def_t *def; |
316 | 316 | qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, |
317 | 317 | *espdma_irq, *ledma_irq; |
318 | + qemu_irq *esp_reset, *le_reset; | |
318 | 319 | |
319 | 320 | /* init CPUs */ |
320 | 321 | sparc_find_by_name(cpu_model, &def); |
... | ... | @@ -352,9 +353,11 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, |
352 | 353 | hwdef->clock_irq); |
353 | 354 | |
354 | 355 | espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], |
355 | - iommu, &espdma_irq); | |
356 | + iommu, &espdma_irq, &esp_reset); | |
357 | + | |
356 | 358 | ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, |
357 | - slavio_irq[hwdef->le_irq], iommu, &ledma_irq); | |
359 | + slavio_irq[hwdef->le_irq], iommu, &ledma_irq, | |
360 | + &le_reset); | |
358 | 361 | |
359 | 362 | if (graphic_depth != 8 && graphic_depth != 24) { |
360 | 363 | fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth); |
... | ... | @@ -365,7 +368,7 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, |
365 | 368 | |
366 | 369 | if (nd_table[0].model == NULL |
367 | 370 | || strcmp(nd_table[0].model, "lance") == 0) { |
368 | - lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq); | |
371 | + lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset); | |
369 | 372 | } else if (strcmp(nd_table[0].model, "?") == 0) { |
370 | 373 | fprintf(stderr, "qemu: Supported NICs: lance\n"); |
371 | 374 | exit (1); |
... | ... | @@ -389,7 +392,9 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, |
389 | 392 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
390 | 393 | serial_hds[1], serial_hds[0]); |
391 | 394 | fdctrl_init(slavio_irq[hwdef->fd_irq], 0, 1, hwdef->fd_base, fd_table); |
392 | - main_esp = esp_init(bs_table, hwdef->esp_base, espdma, *espdma_irq); | |
395 | + | |
396 | + main_esp = esp_init(bs_table, hwdef->esp_base, espdma, *espdma_irq, | |
397 | + esp_reset); | |
393 | 398 | |
394 | 399 | for (i = 0; i < MAX_DISKS; i++) { |
395 | 400 | if (bs_table[i]) { | ... | ... |
vl.h
... | ... | @@ -1054,7 +1054,7 @@ void pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn); |
1054 | 1054 | |
1055 | 1055 | void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn); |
1056 | 1056 | void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, |
1057 | - qemu_irq irq); | |
1057 | + qemu_irq irq, qemu_irq *reset); | |
1058 | 1058 | |
1059 | 1059 | /* vmmouse.c */ |
1060 | 1060 | void *vmmouse_init(void *m); |
... | ... | @@ -1273,19 +1273,17 @@ void slavio_set_power_fail(void *opaque, int power_failing); |
1273 | 1273 | /* esp.c */ |
1274 | 1274 | void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); |
1275 | 1275 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
1276 | - void *dma_opaque, qemu_irq irq); | |
1276 | + void *dma_opaque, qemu_irq irq, qemu_irq *reset); | |
1277 | 1277 | |
1278 | 1278 | /* sparc32_dma.c */ |
1279 | 1279 | void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, |
1280 | - void *iommu, qemu_irq **dev_irq); | |
1280 | + void *iommu, qemu_irq **dev_irq, qemu_irq **reset); | |
1281 | 1281 | void ledma_memory_read(void *opaque, target_phys_addr_t addr, |
1282 | 1282 | uint8_t *buf, int len, int do_bswap); |
1283 | 1283 | void ledma_memory_write(void *opaque, target_phys_addr_t addr, |
1284 | 1284 | uint8_t *buf, int len, int do_bswap); |
1285 | 1285 | void espdma_memory_read(void *opaque, uint8_t *buf, int len); |
1286 | 1286 | void espdma_memory_write(void *opaque, uint8_t *buf, int len); |
1287 | -void sparc32_dma_set_reset_data(void *opaque, void (*dev_reset)(void *opaque), | |
1288 | - void *dev_opaque); | |
1289 | 1287 | |
1290 | 1288 | /* cs4231.c */ |
1291 | 1289 | void cs_init(target_phys_addr_t base, int irq, void *intctl); | ... | ... |