Commit 5aca8c3b2fbada188ff86781fba24685d346cef9
1 parent
db7b5426
Split DMA controller in two
Fix register size related bugs git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2869 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
10 changed files
with
87 additions
and
82 deletions
hw/cs4231.c
| ... | ... | @@ -30,6 +30,7 @@ |
| 30 | 30 | * In addition to Crystal CS4231 there is a DMA controller on Sparc. |
| 31 | 31 | */ |
| 32 | 32 | #define CS_MAXADDR 0x3f |
| 33 | +#define CS_SIZE (CS_MAXADDR + 1) | |
| 33 | 34 | #define CS_REGS 16 |
| 34 | 35 | #define CS_DREGS 32 |
| 35 | 36 | #define CS_MAXDREG (CS_DREGS - 1) |
| ... | ... | @@ -173,7 +174,7 @@ void cs_init(target_phys_addr_t base, int irq, void *intctl) |
| 173 | 174 | return; |
| 174 | 175 | |
| 175 | 176 | cs_io_memory = cpu_register_io_memory(0, cs_mem_read, cs_mem_write, s); |
| 176 | - cpu_register_physical_memory(base, CS_MAXADDR, cs_io_memory); | |
| 177 | + cpu_register_physical_memory(base, CS_SIZE, cs_io_memory); | |
| 177 | 178 | register_savevm("cs4231", base, 1, cs_save, cs_load, s); |
| 178 | 179 | qemu_register_reset(cs_reset, s); |
| 179 | 180 | cs_reset(s); | ... | ... |
hw/esp.c
| ... | ... | @@ -41,7 +41,9 @@ do { printf("ESP: " fmt , ##args); } while (0) |
| 41 | 41 | #define DPRINTF(fmt, args...) |
| 42 | 42 | #endif |
| 43 | 43 | |
| 44 | -#define ESP_MAXREG 0x3f | |
| 44 | +#define ESP_MASK 0x3f | |
| 45 | +#define ESP_REGS 16 | |
| 46 | +#define ESP_SIZE (ESP_REGS * 4) | |
| 45 | 47 | #define TI_BUFSZ 32 |
| 46 | 48 | /* The HBA is ID 7, so for simplicitly limit to 7 devices. */ |
| 47 | 49 | #define ESP_MAX_DEVS 7 |
| ... | ... | @@ -50,8 +52,8 @@ typedef struct ESPState ESPState; |
| 50 | 52 | |
| 51 | 53 | struct ESPState { |
| 52 | 54 | BlockDriverState **bd; |
| 53 | - uint8_t rregs[ESP_MAXREG]; | |
| 54 | - uint8_t wregs[ESP_MAXREG]; | |
| 55 | + uint8_t rregs[ESP_REGS]; | |
| 56 | + uint8_t wregs[ESP_REGS]; | |
| 55 | 57 | int32_t ti_size; |
| 56 | 58 | uint32_t ti_rptr, ti_wptr; |
| 57 | 59 | uint8_t ti_buf[TI_BUFSZ]; |
| ... | ... | @@ -327,12 +329,12 @@ static void handle_ti(ESPState *s) |
| 327 | 329 | } |
| 328 | 330 | } |
| 329 | 331 | |
| 330 | -void esp_reset(void *opaque) | |
| 332 | +static void esp_reset(void *opaque) | |
| 331 | 333 | { |
| 332 | 334 | ESPState *s = opaque; |
| 333 | 335 | |
| 334 | - memset(s->rregs, 0, ESP_MAXREG); | |
| 335 | - memset(s->wregs, 0, ESP_MAXREG); | |
| 336 | + memset(s->rregs, 0, ESP_REGS); | |
| 337 | + memset(s->wregs, 0, ESP_REGS); | |
| 336 | 338 | s->rregs[0x0e] = 0x4; // Indicate fas100a |
| 337 | 339 | s->ti_size = 0; |
| 338 | 340 | s->ti_rptr = 0; |
| ... | ... | @@ -346,7 +348,7 @@ static uint32_t esp_mem_readb(void *opaque, target_phys_addr_t addr) |
| 346 | 348 | ESPState *s = opaque; |
| 347 | 349 | uint32_t saddr; |
| 348 | 350 | |
| 349 | - saddr = (addr & ESP_MAXREG) >> 2; | |
| 351 | + saddr = (addr & ESP_MASK) >> 2; | |
| 350 | 352 | DPRINTF("read reg[%d]: 0x%2.2x\n", saddr, s->rregs[saddr]); |
| 351 | 353 | switch (saddr) { |
| 352 | 354 | case 2: |
| ... | ... | @@ -384,7 +386,7 @@ static void esp_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) |
| 384 | 386 | ESPState *s = opaque; |
| 385 | 387 | uint32_t saddr; |
| 386 | 388 | |
| 387 | - saddr = (addr & ESP_MAXREG) >> 2; | |
| 389 | + saddr = (addr & ESP_MASK) >> 2; | |
| 388 | 390 | DPRINTF("write reg[%d]: 0x%2.2x -> 0x%2.2x\n", saddr, s->wregs[saddr], val); |
| 389 | 391 | switch (saddr) { |
| 390 | 392 | case 0: |
| ... | ... | @@ -501,8 +503,8 @@ static void esp_save(QEMUFile *f, void *opaque) |
| 501 | 503 | { |
| 502 | 504 | ESPState *s = opaque; |
| 503 | 505 | |
| 504 | - qemu_put_buffer(f, s->rregs, ESP_MAXREG); | |
| 505 | - qemu_put_buffer(f, s->wregs, ESP_MAXREG); | |
| 506 | + qemu_put_buffer(f, s->rregs, ESP_REGS); | |
| 507 | + qemu_put_buffer(f, s->wregs, ESP_REGS); | |
| 506 | 508 | qemu_put_be32s(f, &s->ti_size); |
| 507 | 509 | qemu_put_be32s(f, &s->ti_rptr); |
| 508 | 510 | qemu_put_be32s(f, &s->ti_wptr); |
| ... | ... | @@ -523,8 +525,8 @@ static int esp_load(QEMUFile *f, void *opaque, int version_id) |
| 523 | 525 | if (version_id != 3) |
| 524 | 526 | return -EINVAL; // Cannot emulate 2 |
| 525 | 527 | |
| 526 | - qemu_get_buffer(f, s->rregs, ESP_MAXREG); | |
| 527 | - qemu_get_buffer(f, s->wregs, ESP_MAXREG); | |
| 528 | + qemu_get_buffer(f, s->rregs, ESP_REGS); | |
| 529 | + qemu_get_buffer(f, s->wregs, ESP_REGS); | |
| 528 | 530 | qemu_get_be32s(f, &s->ti_size); |
| 529 | 531 | qemu_get_be32s(f, &s->ti_rptr); |
| 530 | 532 | qemu_get_be32s(f, &s->ti_wptr); |
| ... | ... | @@ -574,9 +576,10 @@ void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
| 574 | 576 | |
| 575 | 577 | s->bd = bd; |
| 576 | 578 | s->dma_opaque = dma_opaque; |
| 579 | + sparc32_dma_set_reset_data(dma_opaque, esp_reset, s); | |
| 577 | 580 | |
| 578 | 581 | esp_io_memory = cpu_register_io_memory(0, esp_mem_read, esp_mem_write, s); |
| 579 | - cpu_register_physical_memory(espaddr, ESP_MAXREG*4, esp_io_memory); | |
| 582 | + cpu_register_physical_memory(espaddr, ESP_SIZE, esp_io_memory); | |
| 580 | 583 | |
| 581 | 584 | esp_reset(s); |
| 582 | 585 | ... | ... |
hw/pcnet.c
| ... | ... | @@ -1554,7 +1554,7 @@ static uint32_t pcnet_bcr_readw(PCNetState *s, uint32_t rap) |
| 1554 | 1554 | return val; |
| 1555 | 1555 | } |
| 1556 | 1556 | |
| 1557 | -void pcnet_h_reset(void *opaque) | |
| 1557 | +static void pcnet_h_reset(void *opaque) | |
| 1558 | 1558 | { |
| 1559 | 1559 | PCNetState *s = opaque; |
| 1560 | 1560 | int i; |
| ... | ... | @@ -2032,6 +2032,8 @@ void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, |
| 2032 | 2032 | cpu_register_io_memory(0, lance_mem_read, lance_mem_write, d); |
| 2033 | 2033 | |
| 2034 | 2034 | d->dma_opaque = dma_opaque; |
| 2035 | + sparc32_dma_set_reset_data(dma_opaque, pcnet_h_reset, d); | |
| 2036 | + | |
| 2035 | 2037 | cpu_register_physical_memory(leaddr, 4, lance_io_memory); |
| 2036 | 2038 | |
| 2037 | 2039 | d->irq = irq; | ... | ... |
hw/slavio_intctl.c
| ... | ... | @@ -58,7 +58,9 @@ typedef struct SLAVIO_INTCTLState { |
| 58 | 58 | } SLAVIO_INTCTLState; |
| 59 | 59 | |
| 60 | 60 | #define INTCTL_MAXADDR 0xf |
| 61 | +#define INTCTL_SIZE (INTCTL_MAXADDR + 1) | |
| 61 | 62 | #define INTCTLM_MAXADDR 0x13 |
| 63 | +#define INTCTLM_SIZE (INTCTLM_MAXADDR + 1) | |
| 62 | 64 | #define INTCTLM_MASK 0x1f |
| 63 | 65 | static void slavio_check_interrupts(void *opaque); |
| 64 | 66 | |
| ... | ... | @@ -386,11 +388,12 @@ void *slavio_intctl_init(target_phys_addr_t addr, target_phys_addr_t addrg, |
| 386 | 388 | s->intbit_to_level = intbit_to_level; |
| 387 | 389 | for (i = 0; i < MAX_CPUS; i++) { |
| 388 | 390 | slavio_intctl_io_memory = cpu_register_io_memory(0, slavio_intctl_mem_read, slavio_intctl_mem_write, s); |
| 389 | - cpu_register_physical_memory(addr + i * TARGET_PAGE_SIZE, INTCTL_MAXADDR, slavio_intctl_io_memory); | |
| 391 | + cpu_register_physical_memory(addr + i * TARGET_PAGE_SIZE, INTCTL_SIZE, | |
| 392 | + slavio_intctl_io_memory); | |
| 390 | 393 | } |
| 391 | 394 | |
| 392 | 395 | slavio_intctlm_io_memory = cpu_register_io_memory(0, slavio_intctlm_mem_read, slavio_intctlm_mem_write, s); |
| 393 | - cpu_register_physical_memory(addrg, INTCTLM_MAXADDR, slavio_intctlm_io_memory); | |
| 396 | + cpu_register_physical_memory(addrg, INTCTLM_SIZE, slavio_intctlm_io_memory); | |
| 394 | 397 | |
| 395 | 398 | register_savevm("slavio_intctl", addr, 1, slavio_intctl_save, slavio_intctl_load, s); |
| 396 | 399 | qemu_register_reset(slavio_intctl_reset, s); | ... | ... |
hw/slavio_misc.c
| ... | ... | @@ -47,7 +47,7 @@ typedef struct MiscState { |
| 47 | 47 | uint8_t diag, mctrl, sysctrl; |
| 48 | 48 | } MiscState; |
| 49 | 49 | |
| 50 | -#define MISC_MAXADDR 1 | |
| 50 | +#define MISC_SIZE 1 | |
| 51 | 51 | |
| 52 | 52 | static void slavio_misc_update_irq(void *opaque) |
| 53 | 53 | { |
| ... | ... | @@ -224,19 +224,25 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
| 224 | 224 | |
| 225 | 225 | slavio_misc_io_memory = cpu_register_io_memory(0, slavio_misc_mem_read, slavio_misc_mem_write, s); |
| 226 | 226 | // Slavio control |
| 227 | - cpu_register_physical_memory(base + 0x1800000, MISC_MAXADDR, slavio_misc_io_memory); | |
| 227 | + cpu_register_physical_memory(base + 0x1800000, MISC_SIZE, | |
| 228 | + slavio_misc_io_memory); | |
| 228 | 229 | // AUX 1 |
| 229 | - cpu_register_physical_memory(base + 0x1900000, MISC_MAXADDR, slavio_misc_io_memory); | |
| 230 | + cpu_register_physical_memory(base + 0x1900000, MISC_SIZE, | |
| 231 | + slavio_misc_io_memory); | |
| 230 | 232 | // AUX 2 |
| 231 | - cpu_register_physical_memory(base + 0x1910000, MISC_MAXADDR, slavio_misc_io_memory); | |
| 233 | + cpu_register_physical_memory(base + 0x1910000, MISC_SIZE, | |
| 234 | + slavio_misc_io_memory); | |
| 232 | 235 | // Diagnostics |
| 233 | - cpu_register_physical_memory(base + 0x1a00000, MISC_MAXADDR, slavio_misc_io_memory); | |
| 236 | + cpu_register_physical_memory(base + 0x1a00000, MISC_SIZE, | |
| 237 | + slavio_misc_io_memory); | |
| 234 | 238 | // Modem control |
| 235 | - cpu_register_physical_memory(base + 0x1b00000, MISC_MAXADDR, slavio_misc_io_memory); | |
| 239 | + cpu_register_physical_memory(base + 0x1b00000, MISC_SIZE, | |
| 240 | + slavio_misc_io_memory); | |
| 236 | 241 | // System control |
| 237 | - cpu_register_physical_memory(base + 0x1f00000, MISC_MAXADDR, slavio_misc_io_memory); | |
| 242 | + cpu_register_physical_memory(base + 0x1f00000, MISC_SIZE, | |
| 243 | + slavio_misc_io_memory); | |
| 238 | 244 | // Power management |
| 239 | - cpu_register_physical_memory(power_base, MISC_MAXADDR, slavio_misc_io_memory); | |
| 245 | + cpu_register_physical_memory(power_base, MISC_SIZE, slavio_misc_io_memory); | |
| 240 | 246 | |
| 241 | 247 | s->irq = irq; |
| 242 | 248 | ... | ... |
hw/slavio_serial.c
| ... | ... | @@ -102,6 +102,7 @@ struct SerialState { |
| 102 | 102 | }; |
| 103 | 103 | |
| 104 | 104 | #define SERIAL_MAXADDR 7 |
| 105 | +#define SERIAL_SIZE (SERIAL_MAXADDR + 1) | |
| 105 | 106 | |
| 106 | 107 | static void handle_kbd_command(ChannelState *s, int val); |
| 107 | 108 | static int serial_can_receive(void *opaque); |
| ... | ... | @@ -178,7 +179,7 @@ static void slavio_serial_reset_chn(ChannelState *s) |
| 178 | 179 | int i; |
| 179 | 180 | |
| 180 | 181 | s->reg = 0; |
| 181 | - for (i = 0; i < SERIAL_MAXADDR; i++) { | |
| 182 | + for (i = 0; i < SERIAL_SIZE; i++) { | |
| 182 | 183 | s->rregs[i] = 0; |
| 183 | 184 | s->wregs[i] = 0; |
| 184 | 185 | } |
| ... | ... | @@ -598,7 +599,7 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, |
| 598 | 599 | return NULL; |
| 599 | 600 | |
| 600 | 601 | slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s); |
| 601 | - cpu_register_physical_memory(base, SERIAL_MAXADDR, slavio_serial_io_memory); | |
| 602 | + cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); | |
| 602 | 603 | |
| 603 | 604 | s->chn[0].chr = chr1; |
| 604 | 605 | s->chn[1].chr = chr2; |
| ... | ... | @@ -723,7 +724,7 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq) |
| 723 | 724 | s->chn[1].type = kbd; |
| 724 | 725 | |
| 725 | 726 | slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s); |
| 726 | - cpu_register_physical_memory(base, SERIAL_MAXADDR, slavio_serial_io_memory); | |
| 727 | + cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); | |
| 727 | 728 | |
| 728 | 729 | qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, "QEMU Sun Mouse"); |
| 729 | 730 | qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); | ... | ... |
hw/slavio_timer.c
| ... | ... | @@ -59,6 +59,7 @@ typedef struct SLAVIO_TIMERState { |
| 59 | 59 | } SLAVIO_TIMERState; |
| 60 | 60 | |
| 61 | 61 | #define TIMER_MAXADDR 0x1f |
| 62 | +#define TIMER_SIZE (TIMER_MAXADDR + 1) | |
| 62 | 63 | |
| 63 | 64 | // Update count, set irq, update expire_time |
| 64 | 65 | // Convert from ptimer countdown units |
| ... | ... | @@ -260,7 +261,7 @@ void slavio_timer_init(target_phys_addr_t addr, int irq, int mode, |
| 260 | 261 | |
| 261 | 262 | slavio_timer_io_memory = cpu_register_io_memory(0, slavio_timer_mem_read, |
| 262 | 263 | slavio_timer_mem_write, s); |
| 263 | - cpu_register_physical_memory(addr, TIMER_MAXADDR, slavio_timer_io_memory); | |
| 264 | + cpu_register_physical_memory(addr, TIMER_SIZE, slavio_timer_io_memory); | |
| 264 | 265 | register_savevm("slavio_timer", addr, 2, slavio_timer_save, slavio_timer_load, s); |
| 265 | 266 | qemu_register_reset(slavio_timer_reset, s); |
| 266 | 267 | slavio_timer_reset(s); | ... | ... |
hw/sparc32_dma.c
| ... | ... | @@ -41,22 +41,25 @@ do { printf("DMA: " fmt , ##args); } while (0) |
| 41 | 41 | #define DPRINTF(fmt, args...) |
| 42 | 42 | #endif |
| 43 | 43 | |
| 44 | -#define DMA_REGS 8 | |
| 45 | -#define DMA_MAXADDR (DMA_REGS * 4 - 1) | |
| 44 | +#define DMA_REGS 4 | |
| 45 | +#define DMA_SIZE (4 * sizeof(uint32_t)) | |
| 46 | +#define DMA_MAXADDR (DMA_SIZE - 1) | |
| 46 | 47 | |
| 47 | 48 | #define DMA_VER 0xa0000000 |
| 48 | 49 | #define DMA_INTR 1 |
| 49 | 50 | #define DMA_INTREN 0x10 |
| 50 | 51 | #define DMA_WRITE_MEM 0x100 |
| 51 | 52 | #define DMA_LOADED 0x04000000 |
| 53 | +#define DMA_DRAIN_FIFO 0x40 | |
| 52 | 54 | #define DMA_RESET 0x80 |
| 53 | 55 | |
| 54 | 56 | typedef struct DMAState DMAState; |
| 55 | 57 | |
| 56 | 58 | struct DMAState { |
| 57 | 59 | uint32_t dmaregs[DMA_REGS]; |
| 58 | - qemu_irq espirq, leirq; | |
| 59 | - void *iommu, *esp_opaque, *lance_opaque; | |
| 60 | + qemu_irq irq; | |
| 61 | + void *iommu, *dev_opaque; | |
| 62 | + void (*dev_reset)(void *dev_opaque); | |
| 60 | 63 | qemu_irq *pic; |
| 61 | 64 | }; |
| 62 | 65 | |
| ... | ... | @@ -69,7 +72,7 @@ void ledma_memory_read(void *opaque, target_phys_addr_t addr, |
| 69 | 72 | |
| 70 | 73 | DPRINTF("DMA write, direction: %c, addr 0x%8.8x\n", |
| 71 | 74 | s->dmaregs[0] & DMA_WRITE_MEM ? 'w': 'r', s->dmaregs[1]); |
| 72 | - addr |= s->dmaregs[7]; | |
| 75 | + addr |= s->dmaregs[3]; | |
| 73 | 76 | if (do_bswap) { |
| 74 | 77 | sparc_iommu_memory_read(s->iommu, addr, buf, len); |
| 75 | 78 | } else { |
| ... | ... | @@ -91,7 +94,7 @@ void ledma_memory_write(void *opaque, target_phys_addr_t addr, |
| 91 | 94 | |
| 92 | 95 | DPRINTF("DMA read, direction: %c, addr 0x%8.8x\n", |
| 93 | 96 | s->dmaregs[0] & DMA_WRITE_MEM ? 'w': 'r', s->dmaregs[1]); |
| 94 | - addr |= s->dmaregs[7]; | |
| 97 | + addr |= s->dmaregs[3]; | |
| 95 | 98 | if (do_bswap) { |
| 96 | 99 | sparc_iommu_memory_write(s->iommu, addr, buf, len); |
| 97 | 100 | } else { |
| ... | ... | @@ -118,7 +121,7 @@ void espdma_raise_irq(void *opaque) |
| 118 | 121 | |
| 119 | 122 | DPRINTF("Raise ESP IRQ\n"); |
| 120 | 123 | s->dmaregs[0] |= DMA_INTR; |
| 121 | - qemu_irq_raise(s->espirq); | |
| 124 | + qemu_irq_raise(s->irq); | |
| 122 | 125 | } |
| 123 | 126 | |
| 124 | 127 | void espdma_clear_irq(void *opaque) |
| ... | ... | @@ -127,7 +130,7 @@ void espdma_clear_irq(void *opaque) |
| 127 | 130 | |
| 128 | 131 | s->dmaregs[0] &= ~DMA_INTR; |
| 129 | 132 | DPRINTF("Lower ESP IRQ\n"); |
| 130 | - qemu_irq_lower(s->espirq); | |
| 133 | + qemu_irq_lower(s->irq); | |
| 131 | 134 | } |
| 132 | 135 | |
| 133 | 136 | void espdma_memory_read(void *opaque, uint8_t *buf, int len) |
| ... | ... | @@ -158,7 +161,8 @@ static uint32_t dma_mem_readl(void *opaque, target_phys_addr_t addr) |
| 158 | 161 | uint32_t saddr; |
| 159 | 162 | |
| 160 | 163 | saddr = (addr & DMA_MAXADDR) >> 2; |
| 161 | - DPRINTF("read dmareg[%d]: 0x%8.8x\n", saddr, s->dmaregs[saddr]); | |
| 164 | + DPRINTF("read dmareg " TARGET_FMT_plx ": 0x%8.8x\n", addr, | |
| 165 | + s->dmaregs[saddr]); | |
| 162 | 166 | |
| 163 | 167 | return s->dmaregs[saddr]; |
| 164 | 168 | } |
| ... | ... | @@ -169,37 +173,26 @@ static void dma_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) |
| 169 | 173 | uint32_t saddr; |
| 170 | 174 | |
| 171 | 175 | saddr = (addr & DMA_MAXADDR) >> 2; |
| 172 | - DPRINTF("write dmareg[%d]: 0x%8.8x -> 0x%8.8x\n", saddr, s->dmaregs[saddr], val); | |
| 176 | + DPRINTF("write dmareg " TARGET_FMT_plx ": 0x%8.8x -> 0x%8.8x\n", addr, | |
| 177 | + s->dmaregs[saddr], val); | |
| 173 | 178 | switch (saddr) { |
| 174 | 179 | case 0: |
| 175 | 180 | if (!(val & DMA_INTREN)) { |
| 176 | - DPRINTF("Lower ESP IRQ\n"); | |
| 177 | - qemu_irq_lower(s->espirq); | |
| 181 | + DPRINTF("Lower IRQ\n"); | |
| 182 | + qemu_irq_lower(s->irq); | |
| 178 | 183 | } |
| 179 | 184 | if (val & DMA_RESET) { |
| 180 | - esp_reset(s->esp_opaque); | |
| 181 | - } else if (val & 0x40) { | |
| 182 | - val &= ~0x40; | |
| 185 | + s->dev_reset(s->dev_opaque); | |
| 186 | + } else if (val & DMA_DRAIN_FIFO) { | |
| 187 | + val &= ~DMA_DRAIN_FIFO; | |
| 183 | 188 | } else if (val == 0) |
| 184 | - val = 0x40; | |
| 189 | + val = DMA_DRAIN_FIFO; | |
| 185 | 190 | val &= 0x0fffffff; |
| 186 | 191 | val |= DMA_VER; |
| 187 | 192 | break; |
| 188 | 193 | case 1: |
| 189 | 194 | s->dmaregs[0] |= DMA_LOADED; |
| 190 | 195 | break; |
| 191 | - case 4: | |
| 192 | - /* ??? Should this mask out the lance IRQ? The NIC may re-assert | |
| 193 | - this IRQ unexpectedly. */ | |
| 194 | - if (!(val & DMA_INTREN)) { | |
| 195 | - DPRINTF("Lower Lance IRQ\n"); | |
| 196 | - qemu_irq_lower(s->leirq); | |
| 197 | - } | |
| 198 | - if (val & DMA_RESET) | |
| 199 | - pcnet_h_reset(s->lance_opaque); | |
| 200 | - val &= 0x0fffffff; | |
| 201 | - val |= DMA_VER; | |
| 202 | - break; | |
| 203 | 196 | default: |
| 204 | 197 | break; |
| 205 | 198 | } |
| ... | ... | @@ -222,9 +215,8 @@ static void dma_reset(void *opaque) |
| 222 | 215 | { |
| 223 | 216 | DMAState *s = opaque; |
| 224 | 217 | |
| 225 | - memset(s->dmaregs, 0, DMA_REGS * 4); | |
| 218 | + memset(s->dmaregs, 0, DMA_SIZE); | |
| 226 | 219 | s->dmaregs[0] = DMA_VER; |
| 227 | - s->dmaregs[4] = DMA_VER; | |
| 228 | 220 | } |
| 229 | 221 | |
| 230 | 222 | static void dma_save(QEMUFile *f, void *opaque) |
| ... | ... | @@ -241,7 +233,7 @@ static int dma_load(QEMUFile *f, void *opaque, int version_id) |
| 241 | 233 | DMAState *s = opaque; |
| 242 | 234 | unsigned int i; |
| 243 | 235 | |
| 244 | - if (version_id != 1) | |
| 236 | + if (version_id != 2) | |
| 245 | 237 | return -EINVAL; |
| 246 | 238 | for (i = 0; i < DMA_REGS; i++) |
| 247 | 239 | qemu_get_be32s(f, &s->dmaregs[i]); |
| ... | ... | @@ -249,8 +241,7 @@ static int dma_load(QEMUFile *f, void *opaque, int version_id) |
| 249 | 241 | return 0; |
| 250 | 242 | } |
| 251 | 243 | |
| 252 | -void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq espirq, | |
| 253 | - qemu_irq leirq, void *iommu) | |
| 244 | +void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu) | |
| 254 | 245 | { |
| 255 | 246 | DMAState *s; |
| 256 | 247 | int dma_io_memory; |
| ... | ... | @@ -259,24 +250,23 @@ void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq espirq, |
| 259 | 250 | if (!s) |
| 260 | 251 | return NULL; |
| 261 | 252 | |
| 262 | - s->espirq = espirq; | |
| 263 | - s->leirq = leirq; | |
| 253 | + s->irq = irq; | |
| 264 | 254 | s->iommu = iommu; |
| 265 | 255 | |
| 266 | 256 | dma_io_memory = cpu_register_io_memory(0, dma_mem_read, dma_mem_write, s); |
| 267 | - cpu_register_physical_memory(daddr, 16 * 2, dma_io_memory); | |
| 257 | + cpu_register_physical_memory(daddr, DMA_SIZE, dma_io_memory); | |
| 268 | 258 | |
| 269 | - register_savevm("sparc32_dma", daddr, 1, dma_save, dma_load, s); | |
| 259 | + register_savevm("sparc32_dma", daddr, 2, dma_save, dma_load, s); | |
| 270 | 260 | qemu_register_reset(dma_reset, s); |
| 271 | 261 | |
| 272 | 262 | return s; |
| 273 | 263 | } |
| 274 | 264 | |
| 275 | -void sparc32_dma_set_reset_data(void *opaque, void *esp_opaque, | |
| 276 | - void *lance_opaque) | |
| 265 | +void sparc32_dma_set_reset_data(void *opaque, void (*dev_reset)(void *opaque), | |
| 266 | + void *dev_opaque) | |
| 277 | 267 | { |
| 278 | 268 | DMAState *s = opaque; |
| 279 | 269 | |
| 280 | - s->esp_opaque = esp_opaque; | |
| 281 | - s->lance_opaque = lance_opaque; | |
| 270 | + s->dev_reset = dev_reset; | |
| 271 | + s->dev_opaque = dev_opaque; | |
| 282 | 272 | } | ... | ... |
hw/sun4m.c
| ... | ... | @@ -262,7 +262,7 @@ 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, *dma, *main_esp, *main_lance = NULL; | |
| 265 | + void *iommu, *espdma, *ledma, *main_esp, *main_lance = NULL; | |
| 266 | 266 | const sparc_def_t *def; |
| 267 | 267 | qemu_irq *slavio_irq; |
| 268 | 268 | |
| ... | ... | @@ -295,8 +295,10 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, |
| 295 | 295 | for(i = 0; i < smp_cpus; i++) { |
| 296 | 296 | slavio_intctl_set_cpu(slavio_intctl, i, envs[i]); |
| 297 | 297 | } |
| 298 | - dma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], | |
| 299 | - slavio_irq[hwdef->le_irq], iommu); | |
| 298 | + espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], | |
| 299 | + iommu); | |
| 300 | + ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, | |
| 301 | + slavio_irq[hwdef->le_irq], iommu); | |
| 300 | 302 | |
| 301 | 303 | if (graphic_depth != 8 && graphic_depth != 24) { |
| 302 | 304 | fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth); |
| ... | ... | @@ -307,7 +309,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, |
| 307 | 309 | if (nd_table[0].vlan) { |
| 308 | 310 | if (nd_table[0].model == NULL |
| 309 | 311 | || strcmp(nd_table[0].model, "lance") == 0) { |
| 310 | - main_lance = lance_init(&nd_table[0], hwdef->le_base, dma, | |
| 312 | + main_lance = lance_init(&nd_table[0], hwdef->le_base, ledma, | |
| 311 | 313 | slavio_irq[hwdef->le_irq]); |
| 312 | 314 | } else { |
| 313 | 315 | fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model); |
| ... | ... | @@ -329,7 +331,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, |
| 329 | 331 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
| 330 | 332 | serial_hds[1], serial_hds[0]); |
| 331 | 333 | fdctrl_init(slavio_irq[hwdef->fd_irq], 0, 1, hwdef->fd_base, fd_table); |
| 332 | - main_esp = esp_init(bs_table, hwdef->esp_base, dma); | |
| 334 | + main_esp = esp_init(bs_table, hwdef->esp_base, espdma); | |
| 333 | 335 | |
| 334 | 336 | for (i = 0; i < MAX_DISKS; i++) { |
| 335 | 337 | if (bs_table[i]) { |
| ... | ... | @@ -341,7 +343,6 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, |
| 341 | 343 | slavio_irq[hwdef->me_irq]); |
| 342 | 344 | if (hwdef->cs_base != (target_phys_addr_t)-1) |
| 343 | 345 | cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); |
| 344 | - sparc32_dma_set_reset_data(dma, main_esp, main_lance); | |
| 345 | 346 | } |
| 346 | 347 | |
| 347 | 348 | static void sun4m_load_kernel(long vram_size, int ram_size, int boot_device, | ... | ... |
vl.h
| ... | ... | @@ -1046,7 +1046,6 @@ 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 pcnet_h_reset(void *opaque); | |
| 1050 | 1049 | void *lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque, |
| 1051 | 1050 | qemu_irq irq); |
| 1052 | 1051 | |
| ... | ... | @@ -1265,11 +1264,9 @@ void slavio_set_power_fail(void *opaque, int power_failing); |
| 1265 | 1264 | void esp_scsi_attach(void *opaque, BlockDriverState *bd, int id); |
| 1266 | 1265 | void *esp_init(BlockDriverState **bd, target_phys_addr_t espaddr, |
| 1267 | 1266 | void *dma_opaque); |
| 1268 | -void esp_reset(void *opaque); | |
| 1269 | 1267 | |
| 1270 | 1268 | /* sparc32_dma.c */ |
| 1271 | -void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq espirq, | |
| 1272 | - qemu_irq leirq, void *iommu); | |
| 1269 | +void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq irq, void *iommu); | |
| 1273 | 1270 | void ledma_set_irq(void *opaque, int isr); |
| 1274 | 1271 | void ledma_memory_read(void *opaque, target_phys_addr_t addr, |
| 1275 | 1272 | uint8_t *buf, int len, int do_bswap); |
| ... | ... | @@ -1279,8 +1276,8 @@ void espdma_raise_irq(void *opaque); |
| 1279 | 1276 | void espdma_clear_irq(void *opaque); |
| 1280 | 1277 | void espdma_memory_read(void *opaque, uint8_t *buf, int len); |
| 1281 | 1278 | void espdma_memory_write(void *opaque, uint8_t *buf, int len); |
| 1282 | -void sparc32_dma_set_reset_data(void *opaque, void *esp_opaque, | |
| 1283 | - void *lance_opaque); | |
| 1279 | +void sparc32_dma_set_reset_data(void *opaque, void (*dev_reset)(void *opaque), | |
| 1280 | + void *dev_opaque); | |
| 1284 | 1281 | |
| 1285 | 1282 | /* cs4231.c */ |
| 1286 | 1283 | void cs_init(target_phys_addr_t base, int irq, void *intctl); | ... | ... |