[PULL 10/11] hw/hppa: Split out machine creation
From: Helge Deller This is a preparation patch to allow the creation of additional hppa machine. It splits out the creation of the machine into a - machine_HP_common_init_cpus(), and a - machine_HP_common_init_tail() function. This will allow to reuse the basic functions which are common to all parisc machines. Signed-off-by: Helge Deller --- hw/hppa/machine.c | 171 +++--- 1 file changed, 99 insertions(+), 72 deletions(-) diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c index d459ba631b..2bd02508a9 100644 --- a/hw/hppa/machine.c +++ b/hw/hppa/machine.c @@ -23,6 +23,7 @@ #include "hw/net/lasi_82596.h" #include "hw/nmi.h" #include "hw/pci/pci.h" +#include "hw/pci/pci_device.h" #include "hw/pci-host/dino.h" #include "hw/misc/lasi.h" #include "hppa_hardware.h" @@ -37,6 +38,7 @@ #define enable_lasi_lan() 0 +static DeviceState *lasi_dev; static void hppa_powerdown_req(Notifier *n, void *opaque) { @@ -250,29 +252,20 @@ static DinoState *dino_init(MemoryRegion *addr_space) return DINO_PCI_HOST_BRIDGE(dev); } -static void machine_hppa_init(MachineState *machine) +/* + * Step 1: Create CPUs and Memory + */ +static void machine_HP_common_init_cpus(MachineState *machine) { -const char *kernel_filename = machine->kernel_filename; -const char *kernel_cmdline = machine->kernel_cmdline; -const char *initrd_filename = machine->initrd_filename; -MachineClass *mc = MACHINE_GET_CLASS(machine); -DeviceState *dev, *dino_dev, *lasi_dev; -PCIBus *pci_bus; -ISABus *isa_bus; -char *firmware_filename; -uint64_t firmware_low, firmware_high; -long size; -uint64_t kernel_entry = 0, kernel_low, kernel_high; MemoryRegion *addr_space = get_system_memory(); -MemoryRegion *rom_region; MemoryRegion *cpu_region; long i; unsigned int smp_cpus = machine->smp.cpus; -SysBusDevice *s; +char *name; /* Create CPUs. */ for (i = 0; i < smp_cpus; i++) { -char *name = g_strdup_printf("cpu%ld-io-eir", i); +name = g_strdup_printf("cpu%ld-io-eir", i); cpu[i] = HPPA_CPU(cpu_create(machine->cpu_type)); cpu_region = g_new(MemoryRegion, 1); @@ -295,45 +288,27 @@ static void machine_hppa_init(MachineState *machine) exit(EXIT_FAILURE); } memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1); +} - -/* Init Lasi chip */ -lasi_dev = DEVICE(lasi_init()); -memory_region_add_subregion(addr_space, LASI_HPA, -sysbus_mmio_get_region( -SYS_BUS_DEVICE(lasi_dev), 0)); - -/* Init Dino (PCI host bus chip). */ -dino_dev = DEVICE(dino_init(addr_space)); -memory_region_add_subregion(addr_space, DINO_HPA, -sysbus_mmio_get_region( -SYS_BUS_DEVICE(dino_dev), 0)); -pci_bus = PCI_BUS(qdev_get_child_bus(dino_dev, "pci")); -assert(pci_bus); - -/* Create ISA bus. */ -isa_bus = hppa_isa_bus(); -assert(isa_bus); - -/* Realtime clock, used by firmware for PDC_TOD call. */ -mc146818_rtc_init(isa_bus, 2000, NULL); - -/* Serial ports: Lasi and Dino use a 7.272727 MHz clock. */ -serial_mm_init(addr_space, LASI_UART_HPA + 0x800, 0, -qdev_get_gpio_in(lasi_dev, LASI_IRQ_UART_HPA), 7272727 / 16, -serial_hd(0), DEVICE_BIG_ENDIAN); - -serial_mm_init(addr_space, DINO_UART_HPA + 0x800, 0, -qdev_get_gpio_in(dino_dev, DINO_IRQ_RS232INT), 7272727 / 16, -serial_hd(1), DEVICE_BIG_ENDIAN); - -/* Parallel port */ -parallel_mm_init(addr_space, LASI_LPT_HPA + 0x800, 0, - qdev_get_gpio_in(lasi_dev, LASI_IRQ_LAN_HPA), - parallel_hds[0]); - -/* fw_cfg configuration interface */ -create_fw_cfg(machine, pci_bus); +/* + * Last creation step: Add SCSI discs, NICs, graphics & load firmware + */ +static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus) +{ +const char *kernel_filename = machine->kernel_filename; +const char *kernel_cmdline = machine->kernel_cmdline; +const char *initrd_filename = machine->initrd_filename; +MachineClass *mc = MACHINE_GET_CLASS(machine); +DeviceState *dev; +char *firmware_filename; +uint64_t firmware_low, firmware_high; +long size; +uint64_t kernel_entry = 0, kernel_low, kernel_high; +MemoryRegion *addr_space = get_system_memory(); +MemoryRegion *rom_region; +long i; +unsigned int smp_cpus = machine->smp.cpus; +SysBusDevice *s; /* SCSI disk setup. */ dev = DEVICE(pci_create_simple(pci_bus, -1, "lsi53c895a")); @@ -361,21 +336,12 @@ static void machine_hppa_init(MachineState *machine) } } -/* PS/2 Keyboard/Mouse */ -dev = qdev_new(TYPE_LASIPS2); -sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); -sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
[PULL 10/11] hw/hppa: Split out machine creation
From: Helge Deller This is a preparation patch to allow the creation of additional hppa machine. It splits out the creation of the machine into a - machine_HP_common_init_cpus(), and a - machine_HP_common_init_tail() function. This will allow to reuse the basic functions which are common to all parisc machines. Signed-off-by: Helge Deller --- hw/hppa/machine.c | 171 +++--- 1 file changed, 99 insertions(+), 72 deletions(-) diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c index d459ba631b..2bd02508a9 100644 --- a/hw/hppa/machine.c +++ b/hw/hppa/machine.c @@ -23,6 +23,7 @@ #include "hw/net/lasi_82596.h" #include "hw/nmi.h" #include "hw/pci/pci.h" +#include "hw/pci/pci_device.h" #include "hw/pci-host/dino.h" #include "hw/misc/lasi.h" #include "hppa_hardware.h" @@ -37,6 +38,7 @@ #define enable_lasi_lan() 0 +static DeviceState *lasi_dev; static void hppa_powerdown_req(Notifier *n, void *opaque) { @@ -250,29 +252,20 @@ static DinoState *dino_init(MemoryRegion *addr_space) return DINO_PCI_HOST_BRIDGE(dev); } -static void machine_hppa_init(MachineState *machine) +/* + * Step 1: Create CPUs and Memory + */ +static void machine_HP_common_init_cpus(MachineState *machine) { -const char *kernel_filename = machine->kernel_filename; -const char *kernel_cmdline = machine->kernel_cmdline; -const char *initrd_filename = machine->initrd_filename; -MachineClass *mc = MACHINE_GET_CLASS(machine); -DeviceState *dev, *dino_dev, *lasi_dev; -PCIBus *pci_bus; -ISABus *isa_bus; -char *firmware_filename; -uint64_t firmware_low, firmware_high; -long size; -uint64_t kernel_entry = 0, kernel_low, kernel_high; MemoryRegion *addr_space = get_system_memory(); -MemoryRegion *rom_region; MemoryRegion *cpu_region; long i; unsigned int smp_cpus = machine->smp.cpus; -SysBusDevice *s; +char *name; /* Create CPUs. */ for (i = 0; i < smp_cpus; i++) { -char *name = g_strdup_printf("cpu%ld-io-eir", i); +name = g_strdup_printf("cpu%ld-io-eir", i); cpu[i] = HPPA_CPU(cpu_create(machine->cpu_type)); cpu_region = g_new(MemoryRegion, 1); @@ -295,45 +288,27 @@ static void machine_hppa_init(MachineState *machine) exit(EXIT_FAILURE); } memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1); +} - -/* Init Lasi chip */ -lasi_dev = DEVICE(lasi_init()); -memory_region_add_subregion(addr_space, LASI_HPA, -sysbus_mmio_get_region( -SYS_BUS_DEVICE(lasi_dev), 0)); - -/* Init Dino (PCI host bus chip). */ -dino_dev = DEVICE(dino_init(addr_space)); -memory_region_add_subregion(addr_space, DINO_HPA, -sysbus_mmio_get_region( -SYS_BUS_DEVICE(dino_dev), 0)); -pci_bus = PCI_BUS(qdev_get_child_bus(dino_dev, "pci")); -assert(pci_bus); - -/* Create ISA bus. */ -isa_bus = hppa_isa_bus(); -assert(isa_bus); - -/* Realtime clock, used by firmware for PDC_TOD call. */ -mc146818_rtc_init(isa_bus, 2000, NULL); - -/* Serial ports: Lasi and Dino use a 7.272727 MHz clock. */ -serial_mm_init(addr_space, LASI_UART_HPA + 0x800, 0, -qdev_get_gpio_in(lasi_dev, LASI_IRQ_UART_HPA), 7272727 / 16, -serial_hd(0), DEVICE_BIG_ENDIAN); - -serial_mm_init(addr_space, DINO_UART_HPA + 0x800, 0, -qdev_get_gpio_in(dino_dev, DINO_IRQ_RS232INT), 7272727 / 16, -serial_hd(1), DEVICE_BIG_ENDIAN); - -/* Parallel port */ -parallel_mm_init(addr_space, LASI_LPT_HPA + 0x800, 0, - qdev_get_gpio_in(lasi_dev, LASI_IRQ_LAN_HPA), - parallel_hds[0]); - -/* fw_cfg configuration interface */ -create_fw_cfg(machine, pci_bus); +/* + * Last creation step: Add SCSI discs, NICs, graphics & load firmware + */ +static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus) +{ +const char *kernel_filename = machine->kernel_filename; +const char *kernel_cmdline = machine->kernel_cmdline; +const char *initrd_filename = machine->initrd_filename; +MachineClass *mc = MACHINE_GET_CLASS(machine); +DeviceState *dev; +char *firmware_filename; +uint64_t firmware_low, firmware_high; +long size; +uint64_t kernel_entry = 0, kernel_low, kernel_high; +MemoryRegion *addr_space = get_system_memory(); +MemoryRegion *rom_region; +long i; +unsigned int smp_cpus = machine->smp.cpus; +SysBusDevice *s; /* SCSI disk setup. */ dev = DEVICE(pci_create_simple(pci_bus, -1, "lsi53c895a")); @@ -361,21 +336,12 @@ static void machine_hppa_init(MachineState *machine) } } -/* PS/2 Keyboard/Mouse */ -dev = qdev_new(TYPE_LASIPS2); -sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); -sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,