Commit 0019ad5346509406e93373b58d3066868ea30b96
1 parent
67e42751
Rearrange slavio_misc code to prepare for different addresses
Pass first env instead of using cpu_single_env directly Add Aux1 to Sun4c git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3934 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
175 additions
and
80 deletions
hw/slavio_misc.c
... | ... | @@ -50,7 +50,7 @@ typedef struct MiscState { |
50 | 50 | uint8_t diag, mctrl; |
51 | 51 | uint32_t sysctrl; |
52 | 52 | uint16_t leds; |
53 | - target_phys_addr_t power_base; | |
53 | + CPUState *env; | |
54 | 54 | } MiscState; |
55 | 55 | |
56 | 56 | #define MISC_SIZE 1 |
... | ... | @@ -62,8 +62,6 @@ typedef struct MiscState { |
62 | 62 | #define MISC_MASK 0x0fff0000 |
63 | 63 | #define MISC_LEDS 0x01600000 |
64 | 64 | #define MISC_CFG 0x01800000 |
65 | -#define MISC_AUX1 0x01900000 | |
66 | -#define MISC_AUX2 0x01910000 | |
67 | 65 | #define MISC_DIAG 0x01a00000 |
68 | 66 | #define MISC_MDM 0x01b00000 |
69 | 67 | #define MISC_SYS 0x01f00000 |
... | ... | @@ -122,21 +120,6 @@ static void slavio_misc_mem_writeb(void *opaque, target_phys_addr_t addr, |
122 | 120 | s->config = val & 0xff; |
123 | 121 | slavio_misc_update_irq(s); |
124 | 122 | break; |
125 | - case MISC_AUX1: | |
126 | - MISC_DPRINTF("Write aux1 %2.2x\n", val & 0xff); | |
127 | - s->aux1 = val & 0xff; | |
128 | - break; | |
129 | - case MISC_AUX2: | |
130 | - val &= AUX2_PWRINTCLR | AUX2_PWROFF; | |
131 | - MISC_DPRINTF("Write aux2 %2.2x\n", val); | |
132 | - val |= s->aux2 & AUX2_PWRFAIL; | |
133 | - if (val & AUX2_PWRINTCLR) // Clear Power Fail int | |
134 | - val &= AUX2_PWROFF; | |
135 | - s->aux2 = val; | |
136 | - if (val & AUX2_PWROFF) | |
137 | - qemu_system_shutdown_request(); | |
138 | - slavio_misc_update_irq(s); | |
139 | - break; | |
140 | 123 | case MISC_DIAG: |
141 | 124 | MISC_DPRINTF("Write diag %2.2x\n", val & 0xff); |
142 | 125 | s->diag = val & 0xff; |
... | ... | @@ -146,10 +129,6 @@ static void slavio_misc_mem_writeb(void *opaque, target_phys_addr_t addr, |
146 | 129 | s->mctrl = val & 0xff; |
147 | 130 | break; |
148 | 131 | default: |
149 | - if (addr == s->power_base) { | |
150 | - MISC_DPRINTF("Write power management %2.2x\n", val & 0xff); | |
151 | - cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT); | |
152 | - } | |
153 | 132 | break; |
154 | 133 | } |
155 | 134 | } |
... | ... | @@ -164,14 +143,6 @@ static uint32_t slavio_misc_mem_readb(void *opaque, target_phys_addr_t addr) |
164 | 143 | ret = s->config; |
165 | 144 | MISC_DPRINTF("Read config %2.2x\n", ret); |
166 | 145 | break; |
167 | - case MISC_AUX1: | |
168 | - ret = s->aux1; | |
169 | - MISC_DPRINTF("Read aux1 %2.2x\n", ret); | |
170 | - break; | |
171 | - case MISC_AUX2: | |
172 | - ret = s->aux2; | |
173 | - MISC_DPRINTF("Read aux2 %2.2x\n", ret); | |
174 | - break; | |
175 | 146 | case MISC_DIAG: |
176 | 147 | ret = s->diag; |
177 | 148 | MISC_DPRINTF("Read diag %2.2x\n", ret); |
... | ... | @@ -181,9 +152,6 @@ static uint32_t slavio_misc_mem_readb(void *opaque, target_phys_addr_t addr) |
181 | 152 | MISC_DPRINTF("Read modem control %2.2x\n", ret); |
182 | 153 | break; |
183 | 154 | default: |
184 | - if (addr == s->power_base) { | |
185 | - MISC_DPRINTF("Read power management %2.2x\n", ret); | |
186 | - } | |
187 | 155 | break; |
188 | 156 | } |
189 | 157 | return ret; |
... | ... | @@ -201,6 +169,105 @@ static CPUWriteMemoryFunc *slavio_misc_mem_write[3] = { |
201 | 169 | NULL, |
202 | 170 | }; |
203 | 171 | |
172 | +static void slavio_aux1_mem_writeb(void *opaque, target_phys_addr_t addr, | |
173 | + uint32_t val) | |
174 | +{ | |
175 | + MiscState *s = opaque; | |
176 | + | |
177 | + MISC_DPRINTF("Write aux1 %2.2x\n", val & 0xff); | |
178 | + s->aux1 = val & 0xff; | |
179 | +} | |
180 | + | |
181 | +static uint32_t slavio_aux1_mem_readb(void *opaque, target_phys_addr_t addr) | |
182 | +{ | |
183 | + MiscState *s = opaque; | |
184 | + uint32_t ret = 0; | |
185 | + | |
186 | + ret = s->aux1; | |
187 | + MISC_DPRINTF("Read aux1 %2.2x\n", ret); | |
188 | + | |
189 | + return ret; | |
190 | +} | |
191 | + | |
192 | +static CPUReadMemoryFunc *slavio_aux1_mem_read[3] = { | |
193 | + slavio_aux1_mem_readb, | |
194 | + NULL, | |
195 | + NULL, | |
196 | +}; | |
197 | + | |
198 | +static CPUWriteMemoryFunc *slavio_aux1_mem_write[3] = { | |
199 | + slavio_aux1_mem_writeb, | |
200 | + NULL, | |
201 | + NULL, | |
202 | +}; | |
203 | + | |
204 | +static void slavio_aux2_mem_writeb(void *opaque, target_phys_addr_t addr, | |
205 | + uint32_t val) | |
206 | +{ | |
207 | + MiscState *s = opaque; | |
208 | + | |
209 | + val &= AUX2_PWRINTCLR | AUX2_PWROFF; | |
210 | + MISC_DPRINTF("Write aux2 %2.2x\n", val); | |
211 | + val |= s->aux2 & AUX2_PWRFAIL; | |
212 | + if (val & AUX2_PWRINTCLR) // Clear Power Fail int | |
213 | + val &= AUX2_PWROFF; | |
214 | + s->aux2 = val; | |
215 | + if (val & AUX2_PWROFF) | |
216 | + qemu_system_shutdown_request(); | |
217 | + slavio_misc_update_irq(s); | |
218 | +} | |
219 | + | |
220 | +static uint32_t slavio_aux2_mem_readb(void *opaque, target_phys_addr_t addr) | |
221 | +{ | |
222 | + MiscState *s = opaque; | |
223 | + uint32_t ret = 0; | |
224 | + | |
225 | + ret = s->aux2; | |
226 | + MISC_DPRINTF("Read aux2 %2.2x\n", ret); | |
227 | + | |
228 | + return ret; | |
229 | +} | |
230 | + | |
231 | +static CPUReadMemoryFunc *slavio_aux2_mem_read[3] = { | |
232 | + slavio_aux2_mem_readb, | |
233 | + NULL, | |
234 | + NULL, | |
235 | +}; | |
236 | + | |
237 | +static CPUWriteMemoryFunc *slavio_aux2_mem_write[3] = { | |
238 | + slavio_aux2_mem_writeb, | |
239 | + NULL, | |
240 | + NULL, | |
241 | +}; | |
242 | + | |
243 | +static void apc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | |
244 | +{ | |
245 | + MiscState *s = opaque; | |
246 | + | |
247 | + MISC_DPRINTF("Write power management %2.2x\n", val & 0xff); | |
248 | + cpu_interrupt(s->env, CPU_INTERRUPT_HALT); | |
249 | +} | |
250 | + | |
251 | +static uint32_t apc_mem_readb(void *opaque, target_phys_addr_t addr) | |
252 | +{ | |
253 | + uint32_t ret = 0; | |
254 | + | |
255 | + MISC_DPRINTF("Read power management %2.2x\n", ret); | |
256 | + return ret; | |
257 | +} | |
258 | + | |
259 | +static CPUReadMemoryFunc *apc_mem_read[3] = { | |
260 | + apc_mem_readb, | |
261 | + NULL, | |
262 | + NULL, | |
263 | +}; | |
264 | + | |
265 | +static CPUWriteMemoryFunc *apc_mem_write[3] = { | |
266 | + apc_mem_writeb, | |
267 | + NULL, | |
268 | + NULL, | |
269 | +}; | |
270 | + | |
204 | 271 | static uint32_t slavio_sysctrl_mem_readl(void *opaque, target_phys_addr_t addr) |
205 | 272 | { |
206 | 273 | MiscState *s = opaque; |
... | ... | @@ -338,57 +405,68 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) |
338 | 405 | } |
339 | 406 | |
340 | 407 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
341 | - qemu_irq irq) | |
408 | + target_phys_addr_t aux1_base, | |
409 | + target_phys_addr_t aux2_base, qemu_irq irq, | |
410 | + CPUState *env) | |
342 | 411 | { |
343 | - int slavio_misc_io_memory; | |
412 | + int io; | |
344 | 413 | MiscState *s; |
345 | 414 | |
346 | 415 | s = qemu_mallocz(sizeof(MiscState)); |
347 | 416 | if (!s) |
348 | 417 | return NULL; |
349 | 418 | |
350 | - /* 8 bit registers */ | |
351 | - slavio_misc_io_memory = cpu_register_io_memory(0, slavio_misc_mem_read, | |
352 | - slavio_misc_mem_write, s); | |
353 | - // Slavio control | |
354 | - cpu_register_physical_memory(base + MISC_CFG, MISC_SIZE, | |
355 | - slavio_misc_io_memory); | |
356 | - // AUX 1 | |
357 | - cpu_register_physical_memory(base + MISC_AUX1, MISC_SIZE, | |
358 | - slavio_misc_io_memory); | |
359 | - // AUX 2 | |
360 | - cpu_register_physical_memory(base + MISC_AUX2, MISC_SIZE, | |
361 | - slavio_misc_io_memory); | |
362 | - // Diagnostics | |
363 | - cpu_register_physical_memory(base + MISC_DIAG, MISC_SIZE, | |
364 | - slavio_misc_io_memory); | |
365 | - // Modem control | |
366 | - cpu_register_physical_memory(base + MISC_MDM, MISC_SIZE, | |
367 | - slavio_misc_io_memory); | |
368 | - // Power management | |
369 | - cpu_register_physical_memory(power_base, MISC_SIZE, slavio_misc_io_memory); | |
370 | - s->power_base = power_base; | |
371 | - | |
372 | - /* 16 bit registers */ | |
373 | - slavio_misc_io_memory = cpu_register_io_memory(0, slavio_led_mem_read, | |
374 | - slavio_led_mem_write, s); | |
375 | - /* ss600mp diag LEDs */ | |
376 | - cpu_register_physical_memory(base + MISC_LEDS, MISC_SIZE, | |
377 | - slavio_misc_io_memory); | |
378 | - | |
379 | - /* 32 bit registers */ | |
380 | - slavio_misc_io_memory = cpu_register_io_memory(0, slavio_sysctrl_mem_read, | |
381 | - slavio_sysctrl_mem_write, | |
382 | - s); | |
383 | - // System control | |
384 | - cpu_register_physical_memory(base + MISC_SYS, SYSCTRL_SIZE, | |
385 | - slavio_misc_io_memory); | |
419 | + if (base) { | |
420 | + /* 8 bit registers */ | |
421 | + io = cpu_register_io_memory(0, slavio_misc_mem_read, | |
422 | + slavio_misc_mem_write, s); | |
423 | + // Slavio control | |
424 | + cpu_register_physical_memory(base + MISC_CFG, MISC_SIZE, io); | |
425 | + // Diagnostics | |
426 | + cpu_register_physical_memory(base + MISC_DIAG, MISC_SIZE, io); | |
427 | + // Modem control | |
428 | + cpu_register_physical_memory(base + MISC_MDM, MISC_SIZE, io); | |
429 | + | |
430 | + /* 16 bit registers */ | |
431 | + io = cpu_register_io_memory(0, slavio_led_mem_read, | |
432 | + slavio_led_mem_write, s); | |
433 | + /* ss600mp diag LEDs */ | |
434 | + cpu_register_physical_memory(base + MISC_LEDS, MISC_SIZE, io); | |
435 | + | |
436 | + /* 32 bit registers */ | |
437 | + io = cpu_register_io_memory(0, slavio_sysctrl_mem_read, | |
438 | + slavio_sysctrl_mem_write, s); | |
439 | + // System control | |
440 | + cpu_register_physical_memory(base + MISC_SYS, SYSCTRL_SIZE, io); | |
441 | + } | |
442 | + | |
443 | + // AUX 1 (Misc System Functions) | |
444 | + if (aux1_base) { | |
445 | + io = cpu_register_io_memory(0, slavio_aux1_mem_read, | |
446 | + slavio_aux1_mem_write, s); | |
447 | + cpu_register_physical_memory(aux1_base, MISC_SIZE, io); | |
448 | + } | |
449 | + | |
450 | + // AUX 2 (Software Powerdown Control) | |
451 | + if (aux2_base) { | |
452 | + io = cpu_register_io_memory(0, slavio_aux2_mem_read, | |
453 | + slavio_aux2_mem_write, s); | |
454 | + cpu_register_physical_memory(aux2_base, MISC_SIZE, io); | |
455 | + } | |
456 | + | |
457 | + // Power management (APC) XXX: not a Slavio device | |
458 | + if (power_base) { | |
459 | + io = cpu_register_io_memory(0, apc_mem_read, apc_mem_write, s); | |
460 | + cpu_register_physical_memory(power_base, MISC_SIZE, io); | |
461 | + } | |
386 | 462 | |
387 | 463 | s->irq = irq; |
464 | + s->env = env; | |
388 | 465 | |
389 | 466 | register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, |
390 | 467 | s); |
391 | 468 | qemu_register_reset(slavio_misc_reset, s); |
392 | 469 | slavio_misc_reset(s); |
470 | + | |
393 | 471 | return s; |
394 | 472 | } | ... | ... |
hw/sun4m.c
... | ... | @@ -83,7 +83,7 @@ struct hwdef { |
83 | 83 | target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base; |
84 | 84 | target_phys_addr_t serial_base, fd_base; |
85 | 85 | target_phys_addr_t idreg_base, dma_base, esp_base, le_base; |
86 | - target_phys_addr_t tcx_base, cs_base, power_base; | |
86 | + target_phys_addr_t tcx_base, cs_base, apc_base, aux1_base, aux2_base; | |
87 | 87 | target_phys_addr_t ecc_base; |
88 | 88 | uint32_t ecc_version; |
89 | 89 | target_phys_addr_t sun4c_intctl_base, sun4c_counter_base; |
... | ... | @@ -515,8 +515,9 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, |
515 | 515 | esp_scsi_attach(main_esp, drives_table[index].bdrv, i); |
516 | 516 | } |
517 | 517 | |
518 | - slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->power_base, | |
519 | - slavio_irq[hwdef->me_irq]); | |
518 | + slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base, | |
519 | + hwdef->aux1_base, hwdef->aux2_base, | |
520 | + slavio_irq[hwdef->me_irq], envs[0]); | |
520 | 521 | if (hwdef->cs_base != (target_phys_addr_t)-1) |
521 | 522 | cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); |
522 | 523 | |
... | ... | @@ -662,6 +663,10 @@ static void sun4c_hw_init(const struct hwdef *hwdef, int RAM_size, |
662 | 663 | esp_scsi_attach(main_esp, drives_table[index].bdrv, i); |
663 | 664 | } |
664 | 665 | |
666 | + slavio_misc = slavio_misc_init(-1, hwdef->apc_base, | |
667 | + hwdef->aux1_base, hwdef->aux2_base, | |
668 | + slavio_irq[hwdef->me_irq], env); | |
669 | + | |
665 | 670 | kernel_size = sun4m_load_kernel(kernel_filename, kernel_cmdline, |
666 | 671 | initrd_filename); |
667 | 672 | |
... | ... | @@ -687,7 +692,9 @@ static const struct hwdef hwdefs[] = { |
687 | 692 | .dma_base = 0x78400000, |
688 | 693 | .esp_base = 0x78800000, |
689 | 694 | .le_base = 0x78c00000, |
690 | - .power_base = 0x7a000000, | |
695 | + .apc_base = 0x7a000000, // XXX 0x6a000000, | |
696 | + .aux1_base = 0x71900000, | |
697 | + .aux2_base = 0x71910000, | |
691 | 698 | .ecc_base = -1, |
692 | 699 | .sun4c_intctl_base = -1, |
693 | 700 | .sun4c_counter_base = -1, |
... | ... | @@ -727,7 +734,9 @@ static const struct hwdef hwdefs[] = { |
727 | 734 | .dma_base = 0xef0400000ULL, |
728 | 735 | .esp_base = 0xef0800000ULL, |
729 | 736 | .le_base = 0xef0c00000ULL, |
730 | - .power_base = 0xefa000000ULL, | |
737 | + .apc_base = 0xefa000000ULL, // XXX should not exist | |
738 | + .aux1_base = 0xff1900000ULL, // XXX 0xff1800000ULL, | |
739 | + .aux2_base = 0xff1910000ULL, // XXX 0xff1a01000ULL, | |
731 | 740 | .ecc_base = 0xf00000000ULL, |
732 | 741 | .ecc_version = 0x10000000, // version 0, implementation 1 |
733 | 742 | .sun4c_intctl_base = -1, |
... | ... | @@ -769,7 +778,9 @@ static const struct hwdef hwdefs[] = { |
769 | 778 | .dma_base = 0xef0081000ULL, |
770 | 779 | .esp_base = 0xef0080000ULL, |
771 | 780 | .le_base = 0xef0060000ULL, |
772 | - .power_base = 0xefa000000ULL, | |
781 | + .apc_base = 0xefa000000ULL, // XXX should not exist | |
782 | + .aux1_base = 0xff1900000ULL, // XXX 0xff1800000ULL, | |
783 | + .aux2_base = 0xff1910000ULL, // XXX should not exist | |
773 | 784 | .ecc_base = 0xf00000000ULL, |
774 | 785 | .ecc_version = 0x00000000, // version 0, implementation 0 |
775 | 786 | .sun4c_intctl_base = -1, |
... | ... | @@ -811,7 +822,9 @@ static const struct hwdef hwdefs[] = { |
811 | 822 | .dma_base = 0xef0400000ULL, |
812 | 823 | .esp_base = 0xef0800000ULL, |
813 | 824 | .le_base = 0xef0c00000ULL, |
814 | - .power_base = 0xefa000000ULL, | |
825 | + .apc_base = 0xefa000000ULL, // XXX should not exist | |
826 | + .aux1_base = 0xff1900000ULL, // XXX 0xff1800000ULL, | |
827 | + .aux2_base = 0xff1910000ULL, // XXX 0xff1a01000ULL, | |
815 | 828 | .ecc_base = 0xf00000000ULL, |
816 | 829 | .ecc_version = 0x20000000, // version 0, implementation 2 |
817 | 830 | .sun4c_intctl_base = -1, |
... | ... | @@ -852,7 +865,9 @@ static const struct hwdef hwdefs[] = { |
852 | 865 | .dma_base = 0xf8400000, |
853 | 866 | .esp_base = 0xf8800000, |
854 | 867 | .le_base = 0xf8c00000, |
855 | - .power_base = -1, | |
868 | + .apc_base = -1, | |
869 | + .aux1_base = 0xf7400003, | |
870 | + .aux2_base = -1, | |
856 | 871 | .sun4c_intctl_base = 0xf5000000, |
857 | 872 | .sun4c_counter_base = 0xf3000000, |
858 | 873 | .vram_size = 0x00100000, | ... | ... |
hw/sun4m.h
... | ... | @@ -54,7 +54,9 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, |
54 | 54 | |
55 | 55 | /* slavio_misc.c */ |
56 | 56 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
57 | - qemu_irq irq); | |
57 | + target_phys_addr_t aux1_base, | |
58 | + target_phys_addr_t aux2_base, qemu_irq irq, | |
59 | + CPUState *env); | |
58 | 60 | void slavio_set_power_fail(void *opaque, int power_failing); |
59 | 61 | |
60 | 62 | /* esp.c */ | ... | ... |