Commit 5aca8c3b2fbada188ff86781fba24685d346cef9

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