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 | 51 | typedef struct ESPState ESPState; |
| 52 | 52 | |
| 53 | 53 | struct ESPState { |
| 54 | + qemu_irq irq; | |
| 54 | 55 | BlockDriverState **bd; |
| 55 | 56 | uint8_t rregs[ESP_REGS]; |
| 56 | 57 | uint8_t wregs[ESP_REGS]; |
| ... | ... | @@ -126,7 +127,7 @@ static int get_cmd(ESPState *s, uint8_t *buf) |
| 126 | 127 | s->rregs[4] = STAT_IN; |
| 127 | 128 | s->rregs[5] = INTR_DC; |
| 128 | 129 | s->rregs[6] = SEQ_0; |
| 129 | - espdma_raise_irq(s->dma_opaque); | |
| 130 | + qemu_irq_raise(s->irq); | |
| 130 | 131 | return 0; |
| 131 | 132 | } |
| 132 | 133 | s->current_dev = s->scsi_dev[target]; |
| ... | ... | @@ -156,7 +157,7 @@ static void do_cmd(ESPState *s, uint8_t *buf) |
| 156 | 157 | } |
| 157 | 158 | s->rregs[5] = INTR_BS | INTR_FC; |
| 158 | 159 | s->rregs[6] = SEQ_CD; |
| 159 | - espdma_raise_irq(s->dma_opaque); | |
| 160 | + qemu_irq_raise(s->irq); | |
| 160 | 161 | } |
| 161 | 162 | |
| 162 | 163 | static void handle_satn(ESPState *s) |
| ... | ... | @@ -178,7 +179,7 @@ static void handle_satn_stop(ESPState *s) |
| 178 | 179 | s->rregs[4] = STAT_IN | STAT_TC | STAT_CD; |
| 179 | 180 | s->rregs[5] = INTR_BS | INTR_FC; |
| 180 | 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 | 199 | s->ti_wptr = 0; |
| 199 | 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 | 205 | static void esp_dma_done(ESPState *s) |
| ... | ... | @@ -209,7 +210,7 @@ static void esp_dma_done(ESPState *s) |
| 209 | 210 | s->rregs[7] = 0; |
| 210 | 211 | s->rregs[0] = 0; |
| 211 | 212 | s->rregs[1] = 0; |
| 212 | - espdma_raise_irq(s->dma_opaque); | |
| 213 | + qemu_irq_raise(s->irq); | |
| 213 | 214 | } |
| 214 | 215 | |
| 215 | 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 | 363 | } else { |
| 363 | 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 | 368 | if (s->ti_size == 0) { |
| 368 | 369 | s->ti_rptr = 0; |
| ... | ... | @@ -373,7 +374,7 @@ static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) |
| 373 | 374 | // interrupt |
| 374 | 375 | // Clear interrupt/error status bits |
| 375 | 376 | s->rregs[4] &= ~(STAT_IN | STAT_GE | STAT_PE); |
| 376 | - espdma_clear_irq(s->dma_opaque); | |
| 377 | + qemu_irq_lower(s->irq); | |
| 377 | 378 | break; |
| 378 | 379 | default: |
| 379 | 380 | break; |
| ... | ... | @@ -436,7 +437,7 @@ static void esp_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) |
| 436 | 437 | DPRINTF("Bus reset (%2.2x)\n", val); |
| 437 | 438 | s->rregs[5] = INTR_RST; |
| 438 | 439 | if (!(s->wregs[8] & 0x40)) { |
| 439 | - espdma_raise_irq(s->dma_opaque); | |
| 440 | + qemu_irq_raise(s->irq); | |
| 440 | 441 | } |
| 441 | 442 | break; |
| 442 | 443 | case 0x10: |
| ... | ... | @@ -565,7 +566,7 @@ void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id) |
| 565 | 566 | } |
| 566 | 567 | |
| 567 | 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 | 571 | ESPState *s; |
| 571 | 572 | int esp_io_memory; |
| ... | ... | @@ -575,6 +576,7 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
| 575 | 576 | return NULL; |
| 576 | 577 | |
| 577 | 578 | s->bd = bd; |
| 579 | + s->irq = irq; | |
| 578 | 580 | s->dma_opaque = dma_opaque; |
| 579 | 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 | 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 | 2022 | qemu_irq irq) |
| 2023 | 2023 | { |
| 2024 | 2024 | PCNetState *d; |
| ... | ... | @@ -2026,7 +2026,7 @@ void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, |
| 2026 | 2026 | |
| 2027 | 2027 | d = qemu_mallocz(sizeof(PCNetState)); |
| 2028 | 2028 | if (!d) |
| 2029 | - return NULL; | |
| 2029 | + return; | |
| 2030 | 2030 | |
| 2031 | 2031 | lance_io_memory = |
| 2032 | 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 | 2041 | d->phys_mem_write = ledma_memory_write; |
| 2042 | 2042 | |
| 2043 | 2043 | pcnet_common_init(d, nd, "lance"); |
| 2044 | - | |
| 2045 | - return d; | |
| 2046 | 2044 | } |
| 2047 | 2045 | #endif /* TARGET_SPARC */ | ... | ... |
hw/sparc32_dma.c
| ... | ... | @@ -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 | 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 | 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 | 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 | 243 | DMAState *s; |
| 247 | 244 | int dma_io_memory; |
| ... | ... | @@ -250,7 +247,7 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu) |
| 250 | 247 | if (!s) |
| 251 | 248 | return NULL; |
| 252 | 249 | |
| 253 | - s->irq = irq; | |
| 250 | + s->irq = parent_irq; | |
| 254 | 251 | s->iommu = iommu; |
| 255 | 252 | |
| 256 | 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 | 255 | |
| 259 | 256 | register_savevm("sparc32_dma", daddr, 2, dma_save, dma_load, s); |
| 260 | 257 | qemu_register_reset(dma_reset, s); |
| 258 | + *dev_irq = qemu_allocate_irqs(dma_set_irq, s, 1); | |
| 261 | 259 | |
| 262 | 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 | 262 | { |
| 263 | 263 | CPUState *env, *envs[MAX_CPUS]; |
| 264 | 264 | unsigned int i; |
| 265 | - void *iommu, *espdma, *ledma, *main_esp, *main_lance = NULL; | |
| 265 | + void *iommu, *espdma, *ledma, *main_esp; | |
| 266 | 266 | const sparc_def_t *def; |
| 267 | - qemu_irq *slavio_irq; | |
| 267 | + qemu_irq *slavio_irq, *espdma_irq, *ledma_irq; | |
| 268 | 268 | |
| 269 | 269 | /* init CPUs */ |
| 270 | 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 | 296 | slavio_intctl_set_cpu(slavio_intctl, i, envs[i]); |
| 297 | 297 | } |
| 298 | 298 | espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], |
| 299 | - iommu); | |
| 299 | + iommu, &espdma_irq); | |
| 300 | 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 | 303 | if (graphic_depth != 8 && graphic_depth != 24) { |
| 304 | 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 | 309 | if (nd_table[0].vlan) { |
| 310 | 310 | if (nd_table[0].model == NULL |
| 311 | 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 | 313 | } else { |
| 315 | 314 | fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model); |
| 316 | 315 | exit (1); |
| ... | ... | @@ -331,7 +330,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, |
| 331 | 330 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
| 332 | 331 | serial_hds[1], serial_hds[0]); |
| 333 | 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 | 335 | for (i = 0; i < MAX_DISKS; i++) { |
| 337 | 336 | if (bs_table[i]) { | ... | ... |
vl.h
| ... | ... | @@ -1046,7 +1046,7 @@ void pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn); |
| 1046 | 1046 | /* pcnet.c */ |
| 1047 | 1047 | |
| 1048 | 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 | 1050 | qemu_irq irq); |
| 1051 | 1051 | |
| 1052 | 1052 | /* vmmouse.c */ |
| ... | ... | @@ -1263,17 +1263,15 @@ void slavio_set_power_fail(void *opaque, int power_failing); |
| 1263 | 1263 | /* esp.c */ |
| 1264 | 1264 | void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); |
| 1265 | 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 | 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 | 1271 | void ledma_memory_read(void *opaque, target_phys_addr_t addr, |
| 1272 | 1272 | uint8_t *buf, int len, int do_bswap); |
| 1273 | 1273 | void ledma_memory_write(void *opaque, target_phys_addr_t addr, |
| 1274 | 1274 | uint8_t *buf, int len, int do_bswap); |
| 1275 | -void espdma_raise_irq(void *opaque); | |
| 1276 | -void espdma_clear_irq(void *opaque); | |
| 1277 | 1275 | void espdma_memory_read(void *opaque, uint8_t *buf, int len); |
| 1278 | 1276 | void espdma_memory_write(void *opaque, uint8_t *buf, int len); |
| 1279 | 1277 | void sparc32_dma_set_reset_data(void *opaque, void (*dev_reset)(void *opaque), | ... | ... |