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,6 +344,12 @@ static void esp_reset(void *opaque) | ||
| 344 | s->do_cmd = 0; | 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 | static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) | 353 | static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) |
| 348 | { | 354 | { |
| 349 | ESPState *s = opaque; | 355 | ESPState *s = opaque; |
| @@ -569,7 +575,7 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) | @@ -569,7 +575,7 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) | ||
| 569 | } | 575 | } |
| 570 | 576 | ||
| 571 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | 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 | ESPState *s; | 580 | ESPState *s; |
| 575 | int esp_io_memory; | 581 | int esp_io_memory; |
| @@ -581,7 +587,6 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | @@ -581,7 +587,6 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | ||
| 581 | s->bd = bd; | 587 | s->bd = bd; |
| 582 | s->irq = irq; | 588 | s->irq = irq; |
| 583 | s->dma_opaque = dma_opaque; | 589 | s->dma_opaque = dma_opaque; |
| 584 | - sparc32_dma_set_reset_data(dma_opaque, esp_reset, s); | ||
| 585 | 590 | ||
| 586 | esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s); | 591 | esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s); |
| 587 | cpu_register_physical_memory(espaddr, ESP_SIZE, esp_io_memory); | 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,5 +596,7 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | ||
| 591 | register_savevm("esp", espaddr, 3, esp_save, esp_load, s); | 596 | register_savevm("esp", espaddr, 3, esp_save, esp_load, s); |
| 592 | qemu_register_reset(esp_reset, s); | 597 | qemu_register_reset(esp_reset, s); |
| 593 | 598 | ||
| 599 | + *reset = *qemu_allocate_irqs(parent_esp_reset, s, 1); | ||
| 600 | + | ||
| 594 | return s; | 601 | return s; |
| 595 | } | 602 | } |
hw/pcnet.c
| @@ -2011,6 +2011,12 @@ void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn) | @@ -2011,6 +2011,12 @@ void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn) | ||
| 2011 | 2011 | ||
| 2012 | #if defined (TARGET_SPARC) && !defined(TARGET_SPARC64) // Avoid compile failure | 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 | static void lance_mem_writew(void *opaque, target_phys_addr_t addr, | 2020 | static void lance_mem_writew(void *opaque, target_phys_addr_t addr, |
| 2015 | uint32_t val) | 2021 | uint32_t val) |
| 2016 | { | 2022 | { |
| @@ -2047,7 +2053,7 @@ static CPUWriteMemoryFunc *lance_mem_write[3] = { | @@ -2047,7 +2053,7 @@ static CPUWriteMemoryFunc *lance_mem_write[3] = { | ||
| 2047 | }; | 2053 | }; |
| 2048 | 2054 | ||
| 2049 | void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | 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 | PCNetState *d; | 2058 | PCNetState *d; |
| 2053 | int lance_io_memory; | 2059 | int lance_io_memory; |
| @@ -2060,7 +2066,8 @@ void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | @@ -2060,7 +2066,8 @@ void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | ||
| 2060 | cpu_register_io_memory(0, lance_mem_read, lance_mem_write, d); | 2066 | cpu_register_io_memory(0, lance_mem_read, lance_mem_write, d); |
| 2061 | 2067 | ||
| 2062 | d->dma_opaque = dma_opaque; | 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 | cpu_register_physical_memory(leaddr, 4, lance_io_memory); | 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,9 +58,9 @@ typedef struct DMAState DMAState; | ||
| 58 | struct DMAState { | 58 | struct DMAState { |
| 59 | uint32_t dmaregs[DMA_REGS]; | 59 | uint32_t dmaregs[DMA_REGS]; |
| 60 | qemu_irq irq; | 60 | qemu_irq irq; |
| 61 | - void *iommu, *dev_opaque; | ||
| 62 | - void (*dev_reset)(void *dev_opaque); | 61 | + void *iommu; |
| 63 | qemu_irq *pic; | 62 | qemu_irq *pic; |
| 63 | + qemu_irq dev_reset; | ||
| 64 | }; | 64 | }; |
| 65 | 65 | ||
| 66 | /* Note: on sparc, the lance 16 bit bus is swapped */ | 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,7 +178,8 @@ static void dma_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) | ||
| 178 | qemu_irq_lower(s->irq); | 178 | qemu_irq_lower(s->irq); |
| 179 | } | 179 | } |
| 180 | if (val & DMA_RESET) { | 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 | } else if (val & DMA_DRAIN_FIFO) { | 183 | } else if (val & DMA_DRAIN_FIFO) { |
| 183 | val &= ~DMA_DRAIN_FIFO; | 184 | val &= ~DMA_DRAIN_FIFO; |
| 184 | } else if (val == 0) | 185 | } else if (val == 0) |
| @@ -238,7 +239,7 @@ static int dma_load(QEMUFile *f, void *opaque, int version_id) | @@ -238,7 +239,7 @@ static int dma_load(QEMUFile *f, void *opaque, int version_id) | ||
| 238 | } | 239 | } |
| 239 | 240 | ||
| 240 | void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, | 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 | DMAState *s; | 244 | DMAState *s; |
| 244 | int dma_io_memory; | 245 | int dma_io_memory; |
| @@ -257,14 +258,7 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, | @@ -257,14 +258,7 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, | ||
| 257 | qemu_register_reset(dma_reset, s); | 258 | qemu_register_reset(dma_reset, s); |
| 258 | *dev_irq = qemu_allocate_irqs(dma_set_irq, s, 1); | 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,6 +315,7 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
| 315 | const sparc_def_t *def; | 315 | const sparc_def_t *def; |
| 316 | qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, | 316 | qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, |
| 317 | *espdma_irq, *ledma_irq; | 317 | *espdma_irq, *ledma_irq; |
| 318 | + qemu_irq *esp_reset, *le_reset; | ||
| 318 | 319 | ||
| 319 | /* init CPUs */ | 320 | /* init CPUs */ |
| 320 | sparc_find_by_name(cpu_model, &def); | 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,9 +353,11 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
| 352 | hwdef->clock_irq); | 353 | hwdef->clock_irq); |
| 353 | 354 | ||
| 354 | espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], | 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 | ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, | 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 | if (graphic_depth != 8 && graphic_depth != 24) { | 362 | if (graphic_depth != 8 && graphic_depth != 24) { |
| 360 | fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth); | 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,7 +368,7 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
| 365 | 368 | ||
| 366 | if (nd_table[0].model == NULL | 369 | if (nd_table[0].model == NULL |
| 367 | || strcmp(nd_table[0].model, "lance") == 0) { | 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 | } else if (strcmp(nd_table[0].model, "?") == 0) { | 372 | } else if (strcmp(nd_table[0].model, "?") == 0) { |
| 370 | fprintf(stderr, "qemu: Supported NICs: lance\n"); | 373 | fprintf(stderr, "qemu: Supported NICs: lance\n"); |
| 371 | exit (1); | 374 | exit (1); |
| @@ -389,7 +392,9 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | @@ -389,7 +392,9 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, | ||
| 389 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], | 392 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
| 390 | serial_hds[1], serial_hds[0]); | 393 | serial_hds[1], serial_hds[0]); |
| 391 | fdctrl_init(slavio_irq[hwdef->fd_irq], 0, 1, hwdef->fd_base, fd_table); | 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 | for (i = 0; i < MAX_DISKS; i++) { | 399 | for (i = 0; i < MAX_DISKS; i++) { |
| 395 | if (bs_table[i]) { | 400 | if (bs_table[i]) { |
vl.h
| @@ -1054,7 +1054,7 @@ void pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn); | @@ -1054,7 +1054,7 @@ void pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn); | ||
| 1054 | 1054 | ||
| 1055 | void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn); | 1055 | void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn); |
| 1056 | void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, | 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 | /* vmmouse.c */ | 1059 | /* vmmouse.c */ |
| 1060 | void *vmmouse_init(void *m); | 1060 | void *vmmouse_init(void *m); |
| @@ -1273,19 +1273,17 @@ void slavio_set_power_fail(void *opaque, int power_failing); | @@ -1273,19 +1273,17 @@ void slavio_set_power_fail(void *opaque, int power_failing); | ||
| 1273 | /* esp.c */ | 1273 | /* esp.c */ |
| 1274 | void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); | 1274 | void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); |
| 1275 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, | 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 | /* sparc32_dma.c */ | 1278 | /* sparc32_dma.c */ |
| 1279 | void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq, | 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 | void ledma_memory_read(void *opaque, target_phys_addr_t addr, | 1281 | void ledma_memory_read(void *opaque, target_phys_addr_t addr, |
| 1282 | uint8_t *buf, int len, int do_bswap); | 1282 | uint8_t *buf, int len, int do_bswap); |
| 1283 | void ledma_memory_write(void *opaque, target_phys_addr_t addr, | 1283 | void ledma_memory_write(void *opaque, target_phys_addr_t addr, |
| 1284 | uint8_t *buf, int len, int do_bswap); | 1284 | uint8_t *buf, int len, int do_bswap); |
| 1285 | void espdma_memory_read(void *opaque, uint8_t *buf, int len); | 1285 | void espdma_memory_read(void *opaque, uint8_t *buf, int len); |
| 1286 | void espdma_memory_write(void *opaque, uint8_t *buf, int len); | 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 | /* cs4231.c */ | 1288 | /* cs4231.c */ |
| 1291 | void cs_init(target_phys_addr_t base, int irq, void *intctl); | 1289 | void cs_init(target_phys_addr_t base, int irq, void *intctl); |