Commit 2d069bab6ad7f8c74e49715f7c534e8e799c9855

Authored by blueswir1
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
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]) {
@@ -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);