Commit 2582cfa0cba4d7efb36cee0ab709af6f5d810adc

Authored by Blue Swirl
1 parent 325f2747

Sparc32: convert slavio_misc to qdev

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
hw/slavio_misc.c
... ... @@ -21,9 +21,10 @@
21 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 22 * THE SOFTWARE.
23 23 */
24   -#include "hw.h"
  24 +
25 25 #include "sun4m.h"
26 26 #include "sysemu.h"
  27 +#include "sysbus.h"
27 28  
28 29 /* debug misc */
29 30 //#define DEBUG_MISC
... ... @@ -44,16 +45,21 @@
44 45 #endif
45 46  
46 47 typedef struct MiscState {
  48 + SysBusDevice busdev;
47 49 qemu_irq irq;
48 50 uint8_t config;
49 51 uint8_t aux1, aux2;
50 52 uint8_t diag, mctrl;
51 53 uint32_t sysctrl;
52 54 uint16_t leds;
53   - qemu_irq cpu_halt;
54 55 qemu_irq fdc_tc;
55 56 } MiscState;
56 57  
  58 +typedef struct APCState {
  59 + SysBusDevice busdev;
  60 + qemu_irq cpu_halt;
  61 +} APCState;
  62 +
57 63 #define MISC_SIZE 1
58 64 #define SYSCTRL_SIZE 4
59 65  
... ... @@ -283,7 +289,7 @@ static CPUWriteMemoryFunc *slavio_aux2_mem_write[3] = {
283 289  
284 290 static void apc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
285 291 {
286   - MiscState *s = opaque;
  292 + APCState *s = opaque;
287 293  
288 294 MISC_DPRINTF("Write power management %2.2x\n", val & 0xff);
289 295 qemu_irq_raise(s->cpu_halt);
... ... @@ -434,75 +440,148 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id)
434 440 return 0;
435 441 }
436 442  
437   -void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base,
  443 +void *slavio_misc_init(target_phys_addr_t base,
438 444 target_phys_addr_t aux1_base,
439 445 target_phys_addr_t aux2_base, qemu_irq irq,
440   - qemu_irq cpu_halt, qemu_irq **fdc_tc)
  446 + qemu_irq fdc_tc)
441 447 {
442   - int io;
443   - MiscState *s;
444   -
445   - s = qemu_mallocz(sizeof(MiscState));
  448 + DeviceState *dev;
  449 + SysBusDevice *s;
  450 + MiscState *d;
446 451  
  452 + dev = qdev_create(NULL, "slavio_misc");
  453 + qdev_init(dev);
  454 + s = sysbus_from_qdev(dev);
447 455 if (base) {
448 456 /* 8 bit registers */
449   -
450   - // Slavio control
451   - io = cpu_register_io_memory(slavio_cfg_mem_read,
452   - slavio_cfg_mem_write, s);
453   - cpu_register_physical_memory(base + MISC_CFG, MISC_SIZE, io);
454   -
455   - // Diagnostics
456   - io = cpu_register_io_memory(slavio_diag_mem_read,
457   - slavio_diag_mem_write, s);
458   - cpu_register_physical_memory(base + MISC_DIAG, MISC_SIZE, io);
459   -
460   - // Modem control
461   - io = cpu_register_io_memory(slavio_mdm_mem_read,
462   - slavio_mdm_mem_write, s);
463   - cpu_register_physical_memory(base + MISC_MDM, MISC_SIZE, io);
464   -
  457 + /* Slavio control */
  458 + sysbus_mmio_map(s, 0, base + MISC_CFG);
  459 + /* Diagnostics */
  460 + sysbus_mmio_map(s, 1, base + MISC_DIAG);
  461 + /* Modem control */
  462 + sysbus_mmio_map(s, 2, base + MISC_MDM);
465 463 /* 16 bit registers */
466   - io = cpu_register_io_memory(slavio_led_mem_read,
467   - slavio_led_mem_write, s);
468 464 /* ss600mp diag LEDs */
469   - cpu_register_physical_memory(base + MISC_LEDS, MISC_SIZE, io);
470   -
  465 + sysbus_mmio_map(s, 3, base + MISC_LEDS);
471 466 /* 32 bit registers */
472   - io = cpu_register_io_memory(slavio_sysctrl_mem_read,
473   - slavio_sysctrl_mem_write, s);
474   - // System control
475   - cpu_register_physical_memory(base + MISC_SYS, SYSCTRL_SIZE, io);
  467 + /* System control */
  468 + sysbus_mmio_map(s, 4, base + MISC_SYS);
476 469 }
477   -
478   - // AUX 1 (Misc System Functions)
479 470 if (aux1_base) {
480   - io = cpu_register_io_memory(slavio_aux1_mem_read,
481   - slavio_aux1_mem_write, s);
482   - cpu_register_physical_memory(aux1_base, MISC_SIZE, io);
  471 + /* AUX 1 (Misc System Functions) */
  472 + sysbus_mmio_map(s, 5, aux1_base);
483 473 }
484   -
485   - // AUX 2 (Software Powerdown Control)
486 474 if (aux2_base) {
487   - io = cpu_register_io_memory(slavio_aux2_mem_read,
488   - slavio_aux2_mem_write, s);
489   - cpu_register_physical_memory(aux2_base, MISC_SIZE, io);
  475 + /* AUX 2 (Software Powerdown Control) */
  476 + sysbus_mmio_map(s, 6, aux2_base);
490 477 }
  478 + sysbus_connect_irq(s, 0, irq);
  479 + sysbus_connect_irq(s, 1, fdc_tc);
491 480  
492   - // Power management (APC) XXX: not a Slavio device
493   - if (power_base) {
494   - io = cpu_register_io_memory(apc_mem_read, apc_mem_write, s);
495   - cpu_register_physical_memory(power_base, MISC_SIZE, io);
496   - }
  481 + d = FROM_SYSBUS(MiscState, s);
497 482  
498   - s->irq = irq;
499   - s->cpu_halt = cpu_halt;
500   - *fdc_tc = &s->fdc_tc;
  483 + return d;
  484 +}
  485 +
  486 +static void apc_init1(SysBusDevice *dev)
  487 +{
  488 + APCState *s = FROM_SYSBUS(APCState, dev);
  489 + int io;
501 490  
502   - register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load,
  491 + sysbus_init_irq(dev, &s->cpu_halt);
  492 +
  493 + /* Power management (APC) XXX: not a Slavio device */
  494 + io = cpu_register_io_memory(apc_mem_read, apc_mem_write, s);
  495 + sysbus_init_mmio(dev, MISC_SIZE, io);
  496 +}
  497 +
  498 +void apc_init(target_phys_addr_t power_base, qemu_irq cpu_halt)
  499 +{
  500 + DeviceState *dev;
  501 + SysBusDevice *s;
  502 +
  503 + dev = qdev_create(NULL, "apc");
  504 + qdev_init(dev);
  505 + s = sysbus_from_qdev(dev);
  506 + /* Power management (APC) XXX: not a Slavio device */
  507 + sysbus_mmio_map(s, 0, power_base);
  508 + sysbus_connect_irq(s, 0, cpu_halt);
  509 +}
  510 +
  511 +static void slavio_misc_init1(SysBusDevice *dev)
  512 +{
  513 + MiscState *s = FROM_SYSBUS(MiscState, dev);
  514 + int io;
  515 +
  516 + sysbus_init_irq(dev, &s->irq);
  517 + sysbus_init_irq(dev, &s->fdc_tc);
  518 +
  519 + /* 8 bit registers */
  520 + /* Slavio control */
  521 + io = cpu_register_io_memory(slavio_cfg_mem_read,
  522 + slavio_cfg_mem_write, s);
  523 + sysbus_init_mmio(dev, MISC_SIZE, io);
  524 +
  525 + /* Diagnostics */
  526 + io = cpu_register_io_memory(slavio_diag_mem_read,
  527 + slavio_diag_mem_write, s);
  528 + sysbus_init_mmio(dev, MISC_SIZE, io);
  529 +
  530 + /* Modem control */
  531 + io = cpu_register_io_memory(slavio_mdm_mem_read,
  532 + slavio_mdm_mem_write, s);
  533 + sysbus_init_mmio(dev, MISC_SIZE, io);
  534 +
  535 + /* 16 bit registers */
  536 + /* ss600mp diag LEDs */
  537 + io = cpu_register_io_memory(slavio_led_mem_read,
  538 + slavio_led_mem_write, s);
  539 + sysbus_init_mmio(dev, MISC_SIZE, io);
  540 +
  541 + /* 32 bit registers */
  542 + /* System control */
  543 + io = cpu_register_io_memory(slavio_sysctrl_mem_read,
  544 + slavio_sysctrl_mem_write, s);
  545 + sysbus_init_mmio(dev, SYSCTRL_SIZE, io);
  546 +
  547 + /* AUX 1 (Misc System Functions) */
  548 + io = cpu_register_io_memory(slavio_aux1_mem_read,
  549 + slavio_aux1_mem_write, s);
  550 + sysbus_init_mmio(dev, MISC_SIZE, io);
  551 +
  552 + /* AUX 2 (Software Powerdown Control) */
  553 + io = cpu_register_io_memory(slavio_aux2_mem_read,
  554 + slavio_aux2_mem_write, s);
  555 + sysbus_init_mmio(dev, MISC_SIZE, io);
  556 +
  557 + register_savevm("slavio_misc", -1, 1, slavio_misc_save, slavio_misc_load,
503 558 s);
504 559 qemu_register_reset(slavio_misc_reset, s);
505 560 slavio_misc_reset(s);
  561 +}
506 562  
507   - return s;
  563 +static SysBusDeviceInfo slavio_misc_info = {
  564 + .init = slavio_misc_init1,
  565 + .qdev.name = "slavio_misc",
  566 + .qdev.size = sizeof(MiscState),
  567 + .qdev.props = (DevicePropList[]) {
  568 + {.name = NULL}
  569 + }
  570 +};
  571 +
  572 +static SysBusDeviceInfo apc_info = {
  573 + .init = apc_init1,
  574 + .qdev.name = "apc",
  575 + .qdev.size = sizeof(MiscState),
  576 + .qdev.props = (DevicePropList[]) {
  577 + {.name = NULL}
  578 + }
  579 +};
  580 +
  581 +static void slavio_misc_register_devices(void)
  582 +{
  583 + sysbus_register_withprop(&slavio_misc_info);
  584 + sysbus_register_withprop(&apc_info);
508 585 }
  586 +
  587 +device_init(slavio_misc_register_devices)
... ...
hw/sun4m.c
... ... @@ -435,7 +435,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
435 435 qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq,
436 436 *espdma_irq, *ledma_irq;
437 437 qemu_irq *esp_reset, *le_reset;
438   - qemu_irq *fdc_tc;
  438 + qemu_irq fdc_tc;
439 439 qemu_irq *cpu_halt;
440 440 ram_addr_t ram_offset, prom_offset;
441 441 unsigned long kernel_size;
... ... @@ -553,10 +553,12 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
553 553 serial_hds[0], serial_hds[1], ESCC_CLOCK, 1);
554 554  
555 555 cpu_halt = qemu_allocate_irqs(cpu_halt_signal, NULL, 1);
556   - slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base,
  556 + slavio_misc = slavio_misc_init(hwdef->slavio_base,
557 557 hwdef->aux1_base, hwdef->aux2_base,
558   - slavio_irq[hwdef->me_irq], cpu_halt[0],
559   - &fdc_tc);
  558 + slavio_irq[hwdef->me_irq], fdc_tc);
  559 + if (hwdef->apc_base) {
  560 + apc_init(hwdef->apc_base, cpu_halt[0]);
  561 + }
560 562  
561 563 if (hwdef->fd_base) {
562 564 /* there is zero or one floppy drive */
... ... @@ -566,7 +568,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
566 568 fd[0] = drives_table[drive_index].bdrv;
567 569  
568 570 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
569   - fdc_tc);
  571 + &fdc_tc);
570 572 }
571 573  
572 574 if (drive_get_max_bus(IF_SCSI) > 0) {
... ... @@ -1443,7 +1445,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1443 1445 void *iommu, *espdma, *ledma, *nvram;
1444 1446 qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq;
1445 1447 qemu_irq *esp_reset, *le_reset;
1446   - qemu_irq *fdc_tc;
  1448 + qemu_irq fdc_tc;
1447 1449 ram_addr_t ram_offset, prom_offset;
1448 1450 unsigned long kernel_size;
1449 1451 int ret;
... ... @@ -1539,8 +1541,8 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1539 1541 slavio_irq[hwdef->ser_irq], serial_hds[0], serial_hds[1],
1540 1542 ESCC_CLOCK, 1);
1541 1543  
1542   - slavio_misc = slavio_misc_init(0, 0, hwdef->aux1_base, 0,
1543   - slavio_irq[hwdef->me_irq], NULL, &fdc_tc);
  1544 + slavio_misc = slavio_misc_init(0, hwdef->aux1_base, 0,
  1545 + slavio_irq[hwdef->me_irq], fdc_tc);
1544 1546  
1545 1547 if (hwdef->fd_base != (target_phys_addr_t)-1) {
1546 1548 /* there is zero or one floppy drive */
... ... @@ -1550,7 +1552,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1550 1552 fd[0] = drives_table[drive_index].bdrv;
1551 1553  
1552 1554 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
1553   - fdc_tc);
  1555 + &fdc_tc);
1554 1556 }
1555 1557  
1556 1558 if (drive_get_max_bus(IF_SCSI) > 0) {
... ...
hw/sun4m.h
... ... @@ -50,11 +50,12 @@ void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq,
50 50 qemu_irq *cpu_irqs, unsigned int num_cpus);
51 51  
52 52 /* slavio_misc.c */
53   -void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base,
  53 +void *slavio_misc_init(target_phys_addr_t base,
54 54 target_phys_addr_t aux1_base,
55 55 target_phys_addr_t aux2_base, qemu_irq irq,
56   - qemu_irq cpu_halt, qemu_irq **fdc_tc);
  56 + qemu_irq fdc_tc);
57 57 void slavio_set_power_fail(void *opaque, int power_failing);
  58 +void apc_init(target_phys_addr_t power_base, qemu_irq cpu_halt);
58 59  
59 60 /* cs4231.c */
60 61 void cs_init(target_phys_addr_t base, int irq, void *intctl);
... ...