xref: /qemu/hw/hppa/machine.c (revision 476d6e4c9c4965734d6f47ee299ac9f84440a9b3)
1 /*
2  * QEMU HPPA hardware system emulator.
3  * (C) Copyright 2018-2023 Helge Deller <deller@gmx.de>
4  *
5  * This work is licensed under the GNU GPL license version 2 or later.
6  */
7 
8 #include "qemu/osdep.h"
9 #include "qemu/datadir.h"
10 #include "cpu.h"
11 #include "elf.h"
12 #include "hw/loader.h"
13 #include "qemu/error-report.h"
14 #include "system/reset.h"
15 #include "system/system.h"
16 #include "system/qtest.h"
17 #include "system/runstate.h"
18 #include "hw/rtc/mc146818rtc.h"
19 #include "hw/timer/i8254.h"
20 #include "hw/char/serial-mm.h"
21 #include "hw/char/parallel.h"
22 #include "hw/intc/i8259.h"
23 #include "hw/input/lasips2.h"
24 #include "hw/net/lasi_82596.h"
25 #include "hw/nmi.h"
26 #include "hw/usb.h"
27 #include "hw/pci/pci.h"
28 #include "hw/pci/pci_device.h"
29 #include "hw/pci-host/astro.h"
30 #include "hw/pci-host/dino.h"
31 #include "hw/misc/lasi.h"
32 #include "hppa_hardware.h"
33 #include "qemu/units.h"
34 #include "qapi/error.h"
35 #include "net/net.h"
36 #include "qemu/log.h"
37 
38 #define MIN_SEABIOS_HPPA_VERSION 12 /* require at least this fw version */
39 
40 #define HPA_POWER_BUTTON        (FIRMWARE_END - 0x10)
41 static hwaddr soft_power_reg;
42 
43 #define enable_lasi_lan()       0
44 
45 static DeviceState *lasi_dev;
46 
47 static void hppa_powerdown_req(Notifier *n, void *opaque)
48 {
49     uint32_t val;
50 
51     val = ldl_be_phys(&address_space_memory, soft_power_reg);
52     if ((val >> 8) == 0) {
53         /* immediately shut down when under hardware control */
54         qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
55         return;
56     }
57 
58     /* clear bit 31 to indicate that the power switch was pressed. */
59     val &= ~1;
60     stl_be_phys(&address_space_memory, soft_power_reg, val);
61 }
62 
63 static Notifier hppa_system_powerdown_notifier = {
64     .notify = hppa_powerdown_req
65 };
66 
67 /* Fallback for unassigned PCI I/O operations.  Avoids MCHK.  */
68 static uint64_t ignore_read(void *opaque, hwaddr addr, unsigned size)
69 {
70     return 0;
71 }
72 
73 static void ignore_write(void *opaque, hwaddr addr, uint64_t v, unsigned size)
74 {
75 }
76 
77 static const MemoryRegionOps hppa_pci_ignore_ops = {
78     .read = ignore_read,
79     .write = ignore_write,
80     .endianness = DEVICE_BIG_ENDIAN,
81     .valid = {
82         .min_access_size = 1,
83         .max_access_size = 8,
84     },
85     .impl = {
86         .min_access_size = 1,
87         .max_access_size = 8,
88     },
89 };
90 
91 static ISABus *hppa_isa_bus(hwaddr addr)
92 {
93     ISABus *isa_bus;
94     qemu_irq *isa_irqs;
95     MemoryRegion *isa_region;
96 
97     isa_region = g_new(MemoryRegion, 1);
98     memory_region_init_io(isa_region, NULL, &hppa_pci_ignore_ops,
99                           NULL, "isa-io", 0x800);
100     memory_region_add_subregion(get_system_memory(), addr, isa_region);
101 
102     isa_bus = isa_bus_new(NULL, get_system_memory(), isa_region,
103                           &error_abort);
104     isa_irqs = i8259_init(isa_bus, NULL);
105     isa_bus_register_input_irqs(isa_bus, isa_irqs);
106 
107     return isa_bus;
108 }
109 
110 /*
111  * Helper functions to emulate RTC clock and DebugOutputPort
112  */
113 static time_t rtc_ref;
114 
115 static uint64_t io_cpu_read(void *opaque, hwaddr addr, unsigned size)
116 {
117     uint64_t val = 0;
118 
119     switch (addr) {
120     case 0:             /* RTC clock */
121         val = time(NULL);
122         val += rtc_ref;
123         break;
124     case 8:             /* DebugOutputPort */
125         return 0xe9;    /* readback */
126     }
127     return val;
128 }
129 
130 static void io_cpu_write(void *opaque, hwaddr addr,
131                          uint64_t val, unsigned size)
132 {
133     unsigned char ch;
134     Chardev *debugout;
135 
136     switch (addr) {
137     case 0:             /* RTC clock */
138         rtc_ref = val - time(NULL);
139         break;
140     case 8:             /* DebugOutputPort */
141         ch = val;
142         debugout = serial_hd(0);
143         if (debugout) {
144             qemu_chr_fe_write_all(debugout->be, &ch, 1);
145         } else {
146             fprintf(stderr, "%c", ch);
147         }
148         break;
149     }
150 }
151 
152 static const MemoryRegionOps hppa_io_helper_ops = {
153     .read = io_cpu_read,
154     .write = io_cpu_write,
155     .endianness = DEVICE_BIG_ENDIAN,
156     .valid = {
157         .min_access_size = 1,
158         .max_access_size = 8,
159     },
160     .impl = {
161         .min_access_size = 1,
162         .max_access_size = 8,
163     },
164 };
165 
166 typedef uint64_t TranslateFn(void *opaque, uint64_t addr);
167 
168 static uint64_t linux_kernel_virt_to_phys(void *opaque, uint64_t addr)
169 {
170     addr &= (0x10000000 - 1);
171     return addr;
172 }
173 
174 static uint64_t translate_pa10(void *dummy, uint64_t addr)
175 {
176     return (uint32_t)addr;
177 }
178 
179 static uint64_t translate_pa20(void *dummy, uint64_t addr)
180 {
181     return hppa_abs_to_phys_pa2_w0(addr);
182 }
183 
184 static HPPACPU *cpu[HPPA_MAX_CPUS];
185 static uint64_t firmware_entry;
186 
187 static void fw_cfg_boot_set(void *opaque, const char *boot_device,
188                             Error **errp)
189 {
190     fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
191 }
192 
193 static FWCfgState *create_fw_cfg(MachineState *ms, PCIBus *pci_bus,
194                                  hwaddr addr)
195 {
196     FWCfgState *fw_cfg;
197     uint64_t val;
198     const char qemu_version[] = QEMU_VERSION;
199     MachineClass *mc = MACHINE_GET_CLASS(ms);
200     int btlb_entries = HPPA_BTLB_ENTRIES(&cpu[0]->env);
201     int len;
202 
203     fw_cfg = fw_cfg_init_mem(addr, addr + 4);
204     fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, ms->smp.cpus);
205     fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, HPPA_MAX_CPUS);
206     fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, ms->ram_size);
207 
208     val = cpu_to_le64(MIN_SEABIOS_HPPA_VERSION);
209     fw_cfg_add_file(fw_cfg, "/etc/firmware-min-version",
210                     g_memdup2(&val, sizeof(val)), sizeof(val));
211 
212     val = cpu_to_le64(HPPA_TLB_ENTRIES - btlb_entries);
213     fw_cfg_add_file(fw_cfg, "/etc/cpu/tlb_entries",
214                     g_memdup2(&val, sizeof(val)), sizeof(val));
215 
216     val = cpu_to_le64(btlb_entries);
217     fw_cfg_add_file(fw_cfg, "/etc/cpu/btlb_entries",
218                     g_memdup2(&val, sizeof(val)), sizeof(val));
219 
220     len = strlen(mc->name) + 1;
221     fw_cfg_add_file(fw_cfg, "/etc/hppa/machine",
222                     g_memdup2(mc->name, len), len);
223 
224     val = cpu_to_le64(soft_power_reg);
225     fw_cfg_add_file(fw_cfg, "/etc/hppa/power-button-addr",
226                     g_memdup2(&val, sizeof(val)), sizeof(val));
227 
228     val = cpu_to_le64(CPU_HPA + 16);
229     fw_cfg_add_file(fw_cfg, "/etc/hppa/rtc-addr",
230                     g_memdup2(&val, sizeof(val)), sizeof(val));
231 
232     val = cpu_to_le64(CPU_HPA + 24);
233     fw_cfg_add_file(fw_cfg, "/etc/hppa/DebugOutputPort",
234                     g_memdup2(&val, sizeof(val)), sizeof(val));
235 
236     fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, ms->boot_config.order[0]);
237     qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
238 
239     fw_cfg_add_file(fw_cfg, "/etc/qemu-version",
240                     g_memdup2(qemu_version, sizeof(qemu_version)),
241                     sizeof(qemu_version));
242 
243     pci_bus_add_fw_cfg_extra_pci_roots(fw_cfg, pci_bus, &error_abort);
244 
245     return fw_cfg;
246 }
247 
248 static LasiState *lasi_init(void)
249 {
250     DeviceState *dev;
251 
252     dev = qdev_new(TYPE_LASI_CHIP);
253     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
254 
255     return LASI_CHIP(dev);
256 }
257 
258 static DinoState *dino_init(MemoryRegion *addr_space)
259 {
260     DeviceState *dev;
261 
262     dev = qdev_new(TYPE_DINO_PCI_HOST_BRIDGE);
263     object_property_set_link(OBJECT(dev), "memory-as", OBJECT(addr_space),
264                              &error_fatal);
265     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
266 
267     return DINO_PCI_HOST_BRIDGE(dev);
268 }
269 
270 /*
271  * Step 1: Create CPUs and Memory
272  */
273 static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
274 {
275     MemoryRegion *addr_space = get_system_memory();
276     unsigned int smp_cpus = machine->smp.cpus;
277     TranslateFn *translate;
278     MemoryRegion *cpu_region;
279     uint64_t ram_max;
280 
281     /* Create CPUs.  */
282     for (unsigned int i = 0; i < smp_cpus; i++) {
283         cpu[i] = HPPA_CPU(cpu_create(machine->cpu_type));
284     }
285 
286     /* Initialize memory */
287     if (hppa_is_pa20(&cpu[0]->env)) {
288         translate = translate_pa20;
289         ram_max = 256 * GiB;       /* like HP rp8440 */
290     } else {
291         translate = translate_pa10;
292         ram_max = FIRMWARE_START;  /* 3.75 GB (32-bit CPU) */
293     }
294 
295     soft_power_reg = translate(NULL, HPA_POWER_BUTTON);
296 
297     for (unsigned int i = 0; i < smp_cpus; i++) {
298         g_autofree char *name = g_strdup_printf("cpu%u-io-eir", i);
299 
300         cpu_region = g_new(MemoryRegion, 1);
301         memory_region_init_io(cpu_region, OBJECT(cpu[i]), &hppa_io_eir_ops,
302                               cpu[i], name, 4);
303         memory_region_add_subregion(addr_space,
304                                     translate(NULL, CPU_HPA + i * 0x1000),
305                                     cpu_region);
306     }
307 
308     /* RTC and DebugOutputPort on CPU #0 */
309     cpu_region = g_new(MemoryRegion, 1);
310     memory_region_init_io(cpu_region, OBJECT(cpu[0]), &hppa_io_helper_ops,
311                           cpu[0], "cpu0-io-rtc", 2 * sizeof(uint64_t));
312     memory_region_add_subregion(addr_space, translate(NULL, CPU_HPA + 16),
313                                 cpu_region);
314 
315     /* Main memory region. */
316     if (machine->ram_size > ram_max) {
317         info_report("Max RAM size limited to %" PRIu64 " MB", ram_max / MiB);
318         machine->ram_size = ram_max;
319     }
320     if (machine->ram_size <= FIRMWARE_START) {
321         /* contiguous memory up to 3.75 GB RAM */
322         memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
323     } else {
324         /* non-contiguous: Memory above 3.75 GB is mapped at RAM_MAP_HIGH */
325         MemoryRegion *mem_region;
326         mem_region = g_new(MemoryRegion, 2);
327         memory_region_init_alias(&mem_region[0], &addr_space->parent_obj,
328                               "LowMem", machine->ram, 0, FIRMWARE_START);
329         memory_region_init_alias(&mem_region[1], &addr_space->parent_obj,
330                               "HighMem", machine->ram, FIRMWARE_START,
331                               machine->ram_size - FIRMWARE_START);
332         memory_region_add_subregion_overlap(addr_space, 0, &mem_region[0], -1);
333         memory_region_add_subregion_overlap(addr_space, RAM_MAP_HIGH,
334                                             &mem_region[1], -1);
335     }
336 
337     return translate;
338 }
339 
340 /*
341  * Last creation step: Add SCSI discs, NICs, graphics & load firmware
342  */
343 static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
344                                         TranslateFn *translate)
345 {
346     const char *kernel_filename = machine->kernel_filename;
347     const char *kernel_cmdline = machine->kernel_cmdline;
348     const char *initrd_filename = machine->initrd_filename;
349     const char *firmware = machine->firmware;
350     MachineClass *mc = MACHINE_GET_CLASS(machine);
351     DeviceState *dev;
352     PCIDevice *pci_dev;
353     char *firmware_filename;
354     uint64_t firmware_low, firmware_high;
355     long size;
356     uint64_t kernel_entry = 0, kernel_low, kernel_high;
357     MemoryRegion *addr_space = get_system_memory();
358     MemoryRegion *rom_region;
359     SysBusDevice *s;
360 
361     /* SCSI disk setup. */
362     if (drive_get_max_bus(IF_SCSI) >= 0) {
363         dev = DEVICE(pci_create_simple(pci_bus, -1, "lsi53c895a"));
364         lsi53c8xx_handle_legacy_cmdline(dev);
365     }
366 
367     /* Graphics setup. */
368     if (machine->enable_graphics && vga_interface_type != VGA_NONE) {
369         vga_interface_created = true;
370         dev = qdev_new("artist");
371         s = SYS_BUS_DEVICE(dev);
372         sysbus_realize_and_unref(s, &error_fatal);
373         sysbus_mmio_map(s, 0, translate(NULL, LASI_GFX_HPA));
374         sysbus_mmio_map(s, 1, translate(NULL, ARTIST_FB_ADDR));
375     }
376 
377     /* Network setup. */
378     if (lasi_dev) {
379         lasi_82596_init(addr_space, translate(NULL, LASI_LAN_HPA),
380                         qdev_get_gpio_in(lasi_dev, LASI_IRQ_LAN_HPA),
381                         enable_lasi_lan());
382     }
383 
384     pci_init_nic_devices(pci_bus, mc->default_nic);
385 
386     /* BMC board: HP Powerbar SP2 Diva (with console only) */
387     pci_dev = pci_new(-1, "pci-serial");
388     if (!lasi_dev) {
389         /* bind default keyboard/serial to Diva card */
390         qdev_prop_set_chr(DEVICE(pci_dev), "chardev", serial_hd(0));
391     }
392     qdev_prop_set_uint8(DEVICE(pci_dev), "prog_if", 0);
393     pci_realize_and_unref(pci_dev, pci_bus, &error_fatal);
394     pci_config_set_vendor_id(pci_dev->config, PCI_VENDOR_ID_HP);
395     pci_config_set_device_id(pci_dev->config, 0x1048);
396     pci_set_word(&pci_dev->config[PCI_SUBSYSTEM_VENDOR_ID], PCI_VENDOR_ID_HP);
397     pci_set_word(&pci_dev->config[PCI_SUBSYSTEM_ID], 0x1227); /* Powerbar */
398 
399     /* create a second serial PCI card when running Astro */
400     if (serial_hd(1) && !lasi_dev) {
401         pci_dev = pci_new(-1, "pci-serial-4x");
402         qdev_prop_set_chr(DEVICE(pci_dev), "chardev1", serial_hd(1));
403         qdev_prop_set_chr(DEVICE(pci_dev), "chardev2", serial_hd(2));
404         qdev_prop_set_chr(DEVICE(pci_dev), "chardev3", serial_hd(3));
405         qdev_prop_set_chr(DEVICE(pci_dev), "chardev4", serial_hd(4));
406         pci_realize_and_unref(pci_dev, pci_bus, &error_fatal);
407     }
408 
409     /* create USB OHCI controller for USB keyboard & mouse on Astro machines */
410     if (!lasi_dev && machine->enable_graphics && defaults_enabled()) {
411         USBBus *usb_bus;
412 
413         pci_create_simple(pci_bus, -1, "pci-ohci");
414         usb_bus = USB_BUS(object_resolve_type_unambiguous(TYPE_USB_BUS,
415                                                           &error_abort));
416         usb_create_simple(usb_bus, "usb-kbd");
417         usb_create_simple(usb_bus, "usb-mouse");
418     }
419 
420     /* register power switch emulation */
421     qemu_register_powerdown_notifier(&hppa_system_powerdown_notifier);
422 
423     /* fw_cfg configuration interface */
424     create_fw_cfg(machine, pci_bus, translate(NULL, FW_CFG_IO_BASE));
425 
426     /* Load firmware.  Given that this is not "real" firmware,
427        but one explicitly written for the emulation, we might as
428        well load it directly from an ELF image. Load the 64-bit
429        firmware on 64-bit machines by default if not specified
430        on command line. */
431     if (!qtest_enabled()) {
432         if (!firmware) {
433             firmware = lasi_dev ? "hppa-firmware.img" : "hppa-firmware64.img";
434         }
435         firmware_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, firmware);
436         if (firmware_filename == NULL) {
437             error_report("no firmware provided");
438             exit(1);
439         }
440 
441         size = load_elf(firmware_filename, NULL, translate, NULL,
442                         &firmware_entry, &firmware_low, &firmware_high, NULL,
443                         ELFDATA2MSB, EM_PARISC, 0, 0);
444 
445         if (size < 0) {
446             error_report("could not load firmware '%s'", firmware_filename);
447             exit(1);
448         }
449         qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
450                       "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
451                       firmware_low, firmware_high, firmware_entry);
452         if (firmware_low < translate(NULL, FIRMWARE_START) ||
453             firmware_high >= translate(NULL, FIRMWARE_END)) {
454             error_report("Firmware overlaps with memory or IO space");
455             exit(1);
456         }
457         g_free(firmware_filename);
458     }
459 
460     rom_region = g_new(MemoryRegion, 1);
461     memory_region_init_ram(rom_region, NULL, "firmware",
462                            (FIRMWARE_END - FIRMWARE_START), &error_fatal);
463     memory_region_add_subregion(addr_space,
464                                 translate(NULL, FIRMWARE_START), rom_region);
465 
466     /* Load kernel */
467     if (kernel_filename) {
468         size = load_elf(kernel_filename, NULL, linux_kernel_virt_to_phys,
469                         NULL, &kernel_entry, &kernel_low, &kernel_high, NULL,
470                         ELFDATA2MSB, EM_PARISC, 0, 0);
471 
472         kernel_entry = linux_kernel_virt_to_phys(NULL, kernel_entry);
473 
474         if (size < 0) {
475             error_report("could not load kernel '%s'", kernel_filename);
476             exit(1);
477         }
478         qemu_log_mask(CPU_LOG_PAGE, "Kernel loaded at 0x%08" PRIx64
479                       "-0x%08" PRIx64 ", entry at 0x%08" PRIx64
480                       ", size %" PRIu64 " kB\n",
481                       kernel_low, kernel_high, kernel_entry, size / KiB);
482 
483         if (kernel_cmdline) {
484             cpu[0]->env.cmdline_or_bootorder = 0x4000;
485             pstrcpy_targphys("cmdline", cpu[0]->env.cmdline_or_bootorder,
486                              TARGET_PAGE_SIZE, kernel_cmdline);
487         }
488 
489         if (initrd_filename) {
490             ram_addr_t initrd_base;
491             int64_t initrd_size;
492 
493             initrd_size = get_image_size(initrd_filename);
494             if (initrd_size < 0) {
495                 error_report("could not load initial ram disk '%s'",
496                              initrd_filename);
497                 exit(1);
498             }
499 
500             /* Load the initrd image high in memory.
501                Mirror the algorithm used by palo:
502                (1) Due to sign-extension problems and PDC,
503                put the initrd no higher than 1G.
504                (2) Reserve 64k for stack.  */
505             initrd_base = MIN(machine->ram_size, 1 * GiB);
506             initrd_base = initrd_base - 64 * KiB;
507             initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
508 
509             if (initrd_base < kernel_high) {
510                 error_report("kernel and initial ram disk too large!");
511                 exit(1);
512             }
513 
514             load_image_targphys(initrd_filename, initrd_base, initrd_size);
515             cpu[0]->env.initrd_base = initrd_base;
516             cpu[0]->env.initrd_end  = initrd_base + initrd_size;
517         }
518     }
519 
520     if (!kernel_entry) {
521         /* When booting via firmware, tell firmware if we want interactive
522          * mode (kernel_entry=1), and to boot from CD (cmdline_or_bootorder='d')
523          * or hard disc (cmdline_or_bootorder='c').
524          */
525         kernel_entry = machine->boot_config.has_menu ? machine->boot_config.menu : 0;
526         cpu[0]->env.cmdline_or_bootorder = machine->boot_config.order[0];
527     }
528 
529     /* Keep initial kernel_entry for first boot */
530     cpu[0]->env.kernel_entry = kernel_entry;
531 }
532 
533 /*
534  * Create HP B160L workstation
535  */
536 static void machine_HP_B160L_init(MachineState *machine)
537 {
538     DeviceState *dev, *dino_dev;
539     MemoryRegion *addr_space = get_system_memory();
540     TranslateFn *translate;
541     ISABus *isa_bus;
542     PCIBus *pci_bus;
543 
544     /* Create CPUs and RAM.  */
545     translate = machine_HP_common_init_cpus(machine);
546 
547     if (hppa_is_pa20(&cpu[0]->env)) {
548         error_report("The HP B160L workstation requires a 32-bit "
549                      "CPU. Use '-machine C3700' instead.");
550         exit(1);
551     }
552 
553     /* Init Lasi chip */
554     lasi_dev = DEVICE(lasi_init());
555     memory_region_add_subregion(addr_space, translate(NULL, LASI_HPA),
556                                 sysbus_mmio_get_region(
557                                     SYS_BUS_DEVICE(lasi_dev), 0));
558 
559     /* Init Dino (PCI host bus chip).  */
560     dino_dev = DEVICE(dino_init(addr_space));
561     memory_region_add_subregion(addr_space, translate(NULL, DINO_HPA),
562                                 sysbus_mmio_get_region(
563                                     SYS_BUS_DEVICE(dino_dev), 0));
564     pci_bus = PCI_BUS(qdev_get_child_bus(dino_dev, "pci"));
565     assert(pci_bus);
566 
567     /* Create ISA bus, needed for PS/2 kbd/mouse port emulation */
568     isa_bus = hppa_isa_bus(translate(NULL, IDE_HPA));
569     assert(isa_bus);
570 
571     /* Serial ports: Lasi and Dino use a 7.272727 MHz clock. */
572     serial_mm_init(addr_space, translate(NULL, LASI_UART_HPA + 0x800), 0,
573         qdev_get_gpio_in(lasi_dev, LASI_IRQ_UART_HPA), 7272727 / 16,
574         serial_hd(0), DEVICE_BIG_ENDIAN);
575 
576     serial_mm_init(addr_space, translate(NULL, DINO_UART_HPA + 0x800), 0,
577         qdev_get_gpio_in(dino_dev, DINO_IRQ_RS232INT), 7272727 / 16,
578         serial_hd(1), DEVICE_BIG_ENDIAN);
579 
580     /* Parallel port */
581     parallel_mm_init(addr_space, translate(NULL, LASI_LPT_HPA + 0x800), 0,
582                      qdev_get_gpio_in(lasi_dev, LASI_IRQ_LAN_HPA),
583                      parallel_hds[0]);
584 
585     /* PS/2 Keyboard/Mouse */
586     dev = qdev_new(TYPE_LASIPS2);
587     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
588     sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
589                        qdev_get_gpio_in(lasi_dev, LASI_IRQ_PS2KBD_HPA));
590     memory_region_add_subregion(addr_space,
591                                 translate(NULL, LASI_PS2KBD_HPA),
592                                 sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
593                                                        0));
594     memory_region_add_subregion(addr_space,
595                                 translate(NULL, LASI_PS2KBD_HPA + 0x100),
596                                 sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
597                                                        1));
598 
599     /* Add SCSI discs, NICs, graphics & load firmware */
600     machine_HP_common_init_tail(machine, pci_bus, translate);
601 }
602 
603 static AstroState *astro_init(void)
604 {
605     DeviceState *dev;
606 
607     dev = qdev_new(TYPE_ASTRO_CHIP);
608     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
609 
610     return ASTRO_CHIP(dev);
611 }
612 
613 /*
614  * Create HP C3700 workstation
615  */
616 static void machine_HP_C3700_init(MachineState *machine)
617 {
618     PCIBus *pci_bus;
619     AstroState *astro;
620     DeviceState *astro_dev;
621     MemoryRegion *addr_space = get_system_memory();
622     TranslateFn *translate;
623 
624     /* Create CPUs and RAM.  */
625     translate = machine_HP_common_init_cpus(machine);
626 
627     if (!hppa_is_pa20(&cpu[0]->env)) {
628         error_report("The HP C3000 workstation requires a 64-bit CPU. "
629                      "Use '-machine B160L' instead.");
630         exit(1);
631     }
632 
633     /* Init Astro and the Elroys (PCI host bus chips).  */
634     astro = astro_init();
635     astro_dev = DEVICE(astro);
636     memory_region_add_subregion(addr_space, translate(NULL, ASTRO_HPA),
637                                 sysbus_mmio_get_region(
638                                     SYS_BUS_DEVICE(astro_dev), 0));
639     pci_bus = PCI_BUS(qdev_get_child_bus(DEVICE(astro->elroy[0]), "pci"));
640     assert(pci_bus);
641 
642     /* Add SCSI discs, NICs, graphics & load firmware */
643     machine_HP_common_init_tail(machine, pci_bus, translate);
644 }
645 
646 static void hppa_machine_reset(MachineState *ms, ResetType type)
647 {
648     unsigned int smp_cpus = ms->smp.cpus;
649     int i;
650 
651     qemu_devices_reset(type);
652 
653     /* Start all CPUs at the firmware entry point.
654      *  Monarch CPU will initialize firmware, secondary CPUs
655      *  will enter a small idle loop and wait for rendevouz. */
656     for (i = 0; i < smp_cpus; i++) {
657         CPUState *cs = CPU(cpu[i]);
658 
659         /* reset CPU */
660         resettable_reset(OBJECT(cs), RESET_TYPE_COLD);
661 
662         cpu_set_pc(cs, firmware_entry);
663         cpu[i]->env.psw = PSW_Q;
664         cpu[i]->env.gr[5] = CPU_HPA + i * 0x1000;
665     }
666 
667     cpu[0]->env.gr[26] = ms->ram_size;
668     cpu[0]->env.gr[25] = cpu[0]->env.kernel_entry;
669     cpu[0]->env.gr[24] = cpu[0]->env.cmdline_or_bootorder;
670     cpu[0]->env.gr[23] = cpu[0]->env.initrd_base;
671     cpu[0]->env.gr[22] = cpu[0]->env.initrd_end;
672     cpu[0]->env.gr[21] = smp_cpus;
673     cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
674 
675     /* reset static fields to avoid starting Linux kernel & initrd on reboot */
676     cpu[0]->env.kernel_entry = 0;
677     cpu[0]->env.initrd_base = 0;
678     cpu[0]->env.initrd_end = 0;
679     cpu[0]->env.cmdline_or_bootorder = 'c';
680 }
681 
682 static void hppa_nmi(NMIState *n, int cpu_index, Error **errp)
683 {
684     CPUState *cs;
685 
686     CPU_FOREACH(cs) {
687         cpu_interrupt(cs, CPU_INTERRUPT_NMI);
688     }
689 }
690 
691 static void HP_B160L_machine_init_class_init(ObjectClass *oc, void *data)
692 {
693     static const char * const valid_cpu_types[] = {
694         TYPE_HPPA_CPU,
695         NULL
696     };
697     MachineClass *mc = MACHINE_CLASS(oc);
698     NMIClass *nc = NMI_CLASS(oc);
699 
700     mc->desc = "HP B160L workstation";
701     mc->default_cpu_type = TYPE_HPPA_CPU;
702     mc->valid_cpu_types = valid_cpu_types;
703     mc->init = machine_HP_B160L_init;
704     mc->reset = hppa_machine_reset;
705     mc->block_default_type = IF_SCSI;
706     mc->max_cpus = HPPA_MAX_CPUS;
707     mc->default_cpus = 1;
708     mc->is_default = true;
709     mc->default_ram_size = 512 * MiB;
710     mc->default_boot_order = "cd";
711     mc->default_ram_id = "ram";
712     mc->default_nic = "tulip";
713 
714     nc->nmi_monitor_handler = hppa_nmi;
715 }
716 
717 static const TypeInfo HP_B160L_machine_init_typeinfo = {
718     .name = MACHINE_TYPE_NAME("B160L"),
719     .parent = TYPE_MACHINE,
720     .class_init = HP_B160L_machine_init_class_init,
721     .interfaces = (InterfaceInfo[]) {
722         { TYPE_NMI },
723         { }
724     },
725 };
726 
727 static void HP_C3700_machine_init_class_init(ObjectClass *oc, void *data)
728 {
729     static const char * const valid_cpu_types[] = {
730         TYPE_HPPA64_CPU,
731         NULL
732     };
733     MachineClass *mc = MACHINE_CLASS(oc);
734     NMIClass *nc = NMI_CLASS(oc);
735 
736     mc->desc = "HP C3700 workstation";
737     mc->default_cpu_type = TYPE_HPPA64_CPU;
738     mc->valid_cpu_types = valid_cpu_types;
739     mc->init = machine_HP_C3700_init;
740     mc->reset = hppa_machine_reset;
741     mc->block_default_type = IF_SCSI;
742     mc->max_cpus = HPPA_MAX_CPUS;
743     mc->default_cpus = 1;
744     mc->is_default = false;
745     mc->default_ram_size = 1024 * MiB;
746     mc->default_boot_order = "cd";
747     mc->default_ram_id = "ram";
748     mc->default_nic = "tulip";
749 
750     nc->nmi_monitor_handler = hppa_nmi;
751 }
752 
753 static const TypeInfo HP_C3700_machine_init_typeinfo = {
754     .name = MACHINE_TYPE_NAME("C3700"),
755     .parent = TYPE_MACHINE,
756     .class_init = HP_C3700_machine_init_class_init,
757     .interfaces = (InterfaceInfo[]) {
758         { TYPE_NMI },
759         { }
760     },
761 };
762 
763 static void hppa_machine_init_register_types(void)
764 {
765     type_register_static(&HP_B160L_machine_init_typeinfo);
766     type_register_static(&HP_C3700_machine_init_typeinfo);
767 }
768 
769 type_init(hppa_machine_init_register_types)
770