xref: /openbmc/qemu/hw/hppa/machine.c (revision a72bd606ca9754e2d2aecf75acd3c27564ad4fe0)
1813dff13SHelge Deller /*
2813dff13SHelge Deller  * QEMU HPPA hardware system emulator.
3813dff13SHelge Deller  * Copyright 2018 Helge Deller <deller@gmx.de>
4813dff13SHelge Deller  */
5813dff13SHelge Deller 
6813dff13SHelge Deller #include "qemu/osdep.h"
7813dff13SHelge Deller #include "qemu-common.h"
8813dff13SHelge Deller #include "cpu.h"
9813dff13SHelge Deller #include "hw/hw.h"
10813dff13SHelge Deller #include "elf.h"
11813dff13SHelge Deller #include "hw/loader.h"
12813dff13SHelge Deller #include "hw/boards.h"
13813dff13SHelge Deller #include "qemu/error-report.h"
14813dff13SHelge Deller #include "sysemu/sysemu.h"
15813dff13SHelge Deller #include "hw/timer/mc146818rtc.h"
16813dff13SHelge Deller #include "hw/ide.h"
17813dff13SHelge Deller #include "hw/timer/i8254.h"
18813dff13SHelge Deller #include "hw/char/serial.h"
19*a72bd606SHelge Deller #include "hw/hppa/hppa_sys.h"
20813dff13SHelge Deller #include "qemu/cutils.h"
21813dff13SHelge Deller #include "qapi/error.h"
22813dff13SHelge Deller 
23*a72bd606SHelge Deller #define MAX_IDE_BUS 2
24*a72bd606SHelge Deller 
25*a72bd606SHelge Deller static ISABus *hppa_isa_bus(void)
26*a72bd606SHelge Deller {
27*a72bd606SHelge Deller     ISABus *isa_bus;
28*a72bd606SHelge Deller     qemu_irq *isa_irqs;
29*a72bd606SHelge Deller     MemoryRegion *isa_region;
30*a72bd606SHelge Deller 
31*a72bd606SHelge Deller     isa_region = g_new(MemoryRegion, 1);
32*a72bd606SHelge Deller     memory_region_init_io(isa_region, NULL, &hppa_pci_ignore_ops,
33*a72bd606SHelge Deller                           NULL, "isa-io", 0x800);
34*a72bd606SHelge Deller     memory_region_add_subregion(get_system_memory(), IDE_HPA,
35*a72bd606SHelge Deller                                 isa_region);
36*a72bd606SHelge Deller 
37*a72bd606SHelge Deller     isa_bus = isa_bus_new(NULL, get_system_memory(), isa_region,
38*a72bd606SHelge Deller                           &error_abort);
39*a72bd606SHelge Deller     isa_irqs = i8259_init(isa_bus,
40*a72bd606SHelge Deller                           /* qemu_allocate_irq(dino_set_isa_irq, s, 0)); */
41*a72bd606SHelge Deller                           NULL);
42*a72bd606SHelge Deller     isa_bus_irqs(isa_bus, isa_irqs);
43*a72bd606SHelge Deller 
44*a72bd606SHelge Deller     return isa_bus;
45*a72bd606SHelge Deller }
46*a72bd606SHelge Deller 
47*a72bd606SHelge Deller static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
48*a72bd606SHelge Deller {
49*a72bd606SHelge Deller     addr &= (0x10000000 - 1);
50*a72bd606SHelge Deller     return addr;
51*a72bd606SHelge Deller }
52*a72bd606SHelge Deller 
53*a72bd606SHelge Deller static HPPACPU *cpu[HPPA_MAX_CPUS];
54*a72bd606SHelge Deller static uint64_t firmware_entry;
55813dff13SHelge Deller 
56813dff13SHelge Deller static void machine_hppa_init(MachineState *machine)
57813dff13SHelge Deller {
58*a72bd606SHelge Deller     const char *kernel_filename = machine->kernel_filename;
59*a72bd606SHelge Deller     const char *kernel_cmdline = machine->kernel_cmdline;
60*a72bd606SHelge Deller     const char *initrd_filename = machine->initrd_filename;
61*a72bd606SHelge Deller     PCIBus *pci_bus;
62*a72bd606SHelge Deller     ISABus *isa_bus;
63*a72bd606SHelge Deller     qemu_irq rtc_irq, serial_irq;
64*a72bd606SHelge Deller     char *firmware_filename;
65*a72bd606SHelge Deller     uint64_t firmware_low, firmware_high;
66*a72bd606SHelge Deller     long size;
67*a72bd606SHelge Deller     uint64_t kernel_entry = 0, kernel_low, kernel_high;
68*a72bd606SHelge Deller     MemoryRegion *addr_space = get_system_memory();
69*a72bd606SHelge Deller     MemoryRegion *rom_region;
70*a72bd606SHelge Deller     MemoryRegion *ram_region;
71*a72bd606SHelge Deller     MemoryRegion *cpu_region;
72*a72bd606SHelge Deller     long i;
73*a72bd606SHelge Deller 
74*a72bd606SHelge Deller     ram_size = machine->ram_size;
75*a72bd606SHelge Deller 
76*a72bd606SHelge Deller     /* Create CPUs.  */
77*a72bd606SHelge Deller     for (i = 0; i < smp_cpus; i++) {
78*a72bd606SHelge Deller         cpu[i] = HPPA_CPU(cpu_create(machine->cpu_type));
79*a72bd606SHelge Deller 
80*a72bd606SHelge Deller         cpu_region = g_new(MemoryRegion, 1);
81*a72bd606SHelge Deller         memory_region_init_io(cpu_region, OBJECT(cpu[i]), &hppa_io_eir_ops,
82*a72bd606SHelge Deller                               cpu[i], g_strdup_printf("cpu%ld-io-eir", i), 4);
83*a72bd606SHelge Deller         memory_region_add_subregion(addr_space, CPU_HPA + i * 0x1000,
84*a72bd606SHelge Deller                                     cpu_region);
85813dff13SHelge Deller     }
86813dff13SHelge Deller 
87*a72bd606SHelge Deller     /* Limit main memory. */
88*a72bd606SHelge Deller     if (ram_size > FIRMWARE_START) {
89*a72bd606SHelge Deller         machine->ram_size = ram_size = FIRMWARE_START;
90*a72bd606SHelge Deller     }
91*a72bd606SHelge Deller 
92*a72bd606SHelge Deller     /* Main memory region. */
93*a72bd606SHelge Deller     ram_region = g_new(MemoryRegion, 1);
94*a72bd606SHelge Deller     memory_region_allocate_system_memory(ram_region, OBJECT(machine),
95*a72bd606SHelge Deller                                          "ram", ram_size);
96*a72bd606SHelge Deller     memory_region_add_subregion(addr_space, 0, ram_region);
97*a72bd606SHelge Deller 
98*a72bd606SHelge Deller     /* Init Dino (PCI host bus chip).  */
99*a72bd606SHelge Deller     pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
100*a72bd606SHelge Deller     assert(pci_bus);
101*a72bd606SHelge Deller 
102*a72bd606SHelge Deller     /* Create ISA bus. */
103*a72bd606SHelge Deller     isa_bus = hppa_isa_bus();
104*a72bd606SHelge Deller     assert(isa_bus);
105*a72bd606SHelge Deller 
106*a72bd606SHelge Deller     /* Realtime clock, used by firmware for PDC_TOD call. */
107*a72bd606SHelge Deller     mc146818_rtc_init(isa_bus, 2000, rtc_irq);
108*a72bd606SHelge Deller 
109*a72bd606SHelge Deller     /* Serial code setup.  */
110*a72bd606SHelge Deller     if (serial_hds[0]) {
111*a72bd606SHelge Deller         uint32_t addr = DINO_UART_HPA + 0x800;
112*a72bd606SHelge Deller         serial_mm_init(addr_space, addr, 0, serial_irq,
113*a72bd606SHelge Deller                        115200, serial_hds[0], DEVICE_BIG_ENDIAN);
114*a72bd606SHelge Deller         fprintf(stderr, "Serial port created at 0x%x\n", addr);
115*a72bd606SHelge Deller     }
116*a72bd606SHelge Deller 
117*a72bd606SHelge Deller     /* SCSI disk setup. */
118*a72bd606SHelge Deller     lsi53c895a_create(pci_bus);
119*a72bd606SHelge Deller 
120*a72bd606SHelge Deller     /* Network setup.  e1000 is good enough, failing Tulip support.  */
121*a72bd606SHelge Deller     for (i = 0; i < nb_nics; i++) {
122*a72bd606SHelge Deller         pci_nic_init_nofail(&nd_table[i], pci_bus, "e1000", NULL);
123*a72bd606SHelge Deller     }
124*a72bd606SHelge Deller 
125*a72bd606SHelge Deller     /* Load firmware.  Given that this is not "real" firmware,
126*a72bd606SHelge Deller        but one explicitly written for the emulation, we might as
127*a72bd606SHelge Deller        well load it directly from an ELF image.  */
128*a72bd606SHelge Deller     firmware_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS,
129*a72bd606SHelge Deller                                        bios_name ? bios_name :
130*a72bd606SHelge Deller                                        "hppa-firmware.img");
131*a72bd606SHelge Deller     if (firmware_filename == NULL) {
132*a72bd606SHelge Deller         error_report("no firmware provided");
133*a72bd606SHelge Deller         exit(1);
134*a72bd606SHelge Deller     }
135*a72bd606SHelge Deller 
136*a72bd606SHelge Deller     size = load_elf(firmware_filename, NULL,
137*a72bd606SHelge Deller                     NULL, &firmware_entry, &firmware_low, &firmware_high,
138*a72bd606SHelge Deller                     true, EM_PARISC, 0, 0);
139*a72bd606SHelge Deller 
140*a72bd606SHelge Deller     /* Unfortunately, load_elf sign-extends reading elf32.  */
141*a72bd606SHelge Deller     firmware_entry = (target_ureg)firmware_entry;
142*a72bd606SHelge Deller     firmware_low = (target_ureg)firmware_low;
143*a72bd606SHelge Deller     firmware_high = (target_ureg)firmware_high;
144*a72bd606SHelge Deller 
145*a72bd606SHelge Deller     if (size < 0) {
146*a72bd606SHelge Deller         error_report("could not load firmware '%s'", firmware_filename);
147*a72bd606SHelge Deller         exit(1);
148*a72bd606SHelge Deller     }
149*a72bd606SHelge Deller     fprintf(stderr, "Firmware loaded at 0x%08" PRIx64 "-0x%08" PRIx64
150*a72bd606SHelge Deller             ", entry at 0x%08" PRIx64 ".\n",
151*a72bd606SHelge Deller             firmware_low, firmware_high, firmware_entry);
152*a72bd606SHelge Deller     if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
153*a72bd606SHelge Deller         error_report("Firmware overlaps with memory or IO space");
154*a72bd606SHelge Deller         exit(1);
155*a72bd606SHelge Deller     }
156*a72bd606SHelge Deller     g_free(firmware_filename);
157*a72bd606SHelge Deller 
158*a72bd606SHelge Deller     rom_region = g_new(MemoryRegion, 1);
159*a72bd606SHelge Deller     memory_region_allocate_system_memory(rom_region, OBJECT(machine),
160*a72bd606SHelge Deller                                          "firmware",
161*a72bd606SHelge Deller                                          (FIRMWARE_END - FIRMWARE_START));
162*a72bd606SHelge Deller     memory_region_add_subregion(addr_space, FIRMWARE_START, rom_region);
163*a72bd606SHelge Deller 
164*a72bd606SHelge Deller     /* Load kernel */
165*a72bd606SHelge Deller     if (kernel_filename) {
166*a72bd606SHelge Deller         fprintf(stderr, "LOADING kernel '%s'\n", kernel_filename);
167*a72bd606SHelge Deller         size = load_elf(kernel_filename, &cpu_hppa_to_phys,
168*a72bd606SHelge Deller                         NULL, &kernel_entry, &kernel_low, &kernel_high,
169*a72bd606SHelge Deller                         true, EM_PARISC, 0, 0);
170*a72bd606SHelge Deller 
171*a72bd606SHelge Deller         /* Unfortunately, load_elf sign-extends reading elf32.  */
172*a72bd606SHelge Deller         kernel_entry = (target_ureg) cpu_hppa_to_phys(NULL, kernel_entry);
173*a72bd606SHelge Deller         kernel_low = (target_ureg)kernel_low;
174*a72bd606SHelge Deller         kernel_high = (target_ureg)kernel_high;
175*a72bd606SHelge Deller 
176*a72bd606SHelge Deller         if (size < 0) {
177*a72bd606SHelge Deller             error_report("could not load kernel '%s'", kernel_filename);
178*a72bd606SHelge Deller             exit(1);
179*a72bd606SHelge Deller         }
180*a72bd606SHelge Deller 
181*a72bd606SHelge Deller         fprintf(stderr, "Kernel loaded at 0x%08" PRIx64 "-0x%08" PRIx64
182*a72bd606SHelge Deller                 ", entry at 0x%08" PRIx64 ", size %ld kB.\n",
183*a72bd606SHelge Deller                 kernel_low, kernel_high, kernel_entry, size / 1024);
184*a72bd606SHelge Deller 
185*a72bd606SHelge Deller         if (kernel_cmdline) {
186*a72bd606SHelge Deller             cpu[0]->env.gr[24] = 0x4000;
187*a72bd606SHelge Deller             pstrcpy_targphys("cmdline", cpu[0]->env.gr[24],
188*a72bd606SHelge Deller                              TARGET_PAGE_SIZE, kernel_cmdline);
189*a72bd606SHelge Deller         }
190*a72bd606SHelge Deller 
191*a72bd606SHelge Deller         if (initrd_filename) {
192*a72bd606SHelge Deller             ram_addr_t initrd_base;
193*a72bd606SHelge Deller             long initrd_size;
194*a72bd606SHelge Deller 
195*a72bd606SHelge Deller             initrd_size = get_image_size(initrd_filename);
196*a72bd606SHelge Deller             if (initrd_size < 0) {
197*a72bd606SHelge Deller                 error_report("could not load initial ram disk '%s'",
198*a72bd606SHelge Deller                              initrd_filename);
199*a72bd606SHelge Deller                 exit(1);
200*a72bd606SHelge Deller             }
201*a72bd606SHelge Deller 
202*a72bd606SHelge Deller             /* Load the initrd image high in memory.
203*a72bd606SHelge Deller                Mirror the algorithm used by palo:
204*a72bd606SHelge Deller                (1) Due to sign-extension problems and PDC,
205*a72bd606SHelge Deller                put the initrd no higher than 1G.
206*a72bd606SHelge Deller                (2) Reserve 64k for stack.  */
207*a72bd606SHelge Deller             initrd_base = MIN(ram_size, 1024 * 1024 * 1024);
208*a72bd606SHelge Deller             initrd_base = initrd_base - 64 * 1024;
209*a72bd606SHelge Deller             initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
210*a72bd606SHelge Deller 
211*a72bd606SHelge Deller             if (initrd_base < kernel_high) {
212*a72bd606SHelge Deller                 error_report("kernel and initial ram disk too large!");
213*a72bd606SHelge Deller                 exit(1);
214*a72bd606SHelge Deller             }
215*a72bd606SHelge Deller 
216*a72bd606SHelge Deller             load_image_targphys(initrd_filename, initrd_base, initrd_size);
217*a72bd606SHelge Deller             cpu[0]->env.gr[23] = initrd_base;
218*a72bd606SHelge Deller             cpu[0]->env.gr[22] = initrd_base + initrd_size;
219*a72bd606SHelge Deller         }
220*a72bd606SHelge Deller     }
221*a72bd606SHelge Deller 
222*a72bd606SHelge Deller     if (!kernel_entry) {
223*a72bd606SHelge Deller         /* When booting via firmware, tell firmware if we want interactive
224*a72bd606SHelge Deller          * mode (kernel_entry=1), and to boot from CD (gr[24]='d')
225*a72bd606SHelge Deller          * or hard disc * (gr[24]='c').
226*a72bd606SHelge Deller          */
227*a72bd606SHelge Deller         kernel_entry = boot_menu ? 1 : 0;
228*a72bd606SHelge Deller         cpu[0]->env.gr[24] = machine->boot_order[0];
229*a72bd606SHelge Deller     }
230*a72bd606SHelge Deller 
231*a72bd606SHelge Deller     /* We jump to the firmware entry routine and pass the
232*a72bd606SHelge Deller      * various parameters in registers. After firmware initialization,
233*a72bd606SHelge Deller      * firmware will start the Linux kernel with ramdisk and cmdline.
234*a72bd606SHelge Deller      */
235*a72bd606SHelge Deller     cpu[0]->env.gr[26] = ram_size;
236*a72bd606SHelge Deller     cpu[0]->env.gr[25] = kernel_entry;
237*a72bd606SHelge Deller 
238*a72bd606SHelge Deller     /* tell firmware how many SMP CPUs to present in inventory table */
239*a72bd606SHelge Deller     cpu[0]->env.gr[21] = smp_cpus;
240*a72bd606SHelge Deller }
241*a72bd606SHelge Deller 
242*a72bd606SHelge Deller static void hppa_machine_reset(void)
243*a72bd606SHelge Deller {
244*a72bd606SHelge Deller     int i;
245*a72bd606SHelge Deller 
246*a72bd606SHelge Deller     qemu_devices_reset();
247*a72bd606SHelge Deller 
248*a72bd606SHelge Deller     /* Start all CPUs at the firmware entry point.
249*a72bd606SHelge Deller      *  Monarch CPU will initialize firmware, secondary CPUs
250*a72bd606SHelge Deller      *  will enter a small idle look and wait for rendevouz. */
251*a72bd606SHelge Deller     for (i = 0; i < smp_cpus; i++) {
252*a72bd606SHelge Deller         cpu_set_pc(CPU(cpu[i]), firmware_entry);
253*a72bd606SHelge Deller         cpu[i]->env.gr[5] = CPU_HPA + i * 0x1000;
254*a72bd606SHelge Deller     }
255*a72bd606SHelge Deller 
256*a72bd606SHelge Deller     /* already initialized by machine_hppa_init()? */
257*a72bd606SHelge Deller     if (cpu[0]->env.gr[26] == ram_size) {
258*a72bd606SHelge Deller         return;
259*a72bd606SHelge Deller     }
260*a72bd606SHelge Deller 
261*a72bd606SHelge Deller     cpu[0]->env.gr[26] = ram_size;
262*a72bd606SHelge Deller     cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
263*a72bd606SHelge Deller     cpu[0]->env.gr[24] = 'c';
264*a72bd606SHelge Deller     /* gr22/gr23 unused, no initrd while reboot. */
265*a72bd606SHelge Deller     cpu[0]->env.gr[21] = smp_cpus;
266*a72bd606SHelge Deller }
267*a72bd606SHelge Deller 
268*a72bd606SHelge Deller 
269813dff13SHelge Deller static void machine_hppa_machine_init(MachineClass *mc)
270813dff13SHelge Deller {
271813dff13SHelge Deller     mc->desc = "HPPA generic machine";
272*a72bd606SHelge Deller     mc->default_cpu_type = TYPE_HPPA_CPU;
273813dff13SHelge Deller     mc->init = machine_hppa_init;
274*a72bd606SHelge Deller     mc->reset = hppa_machine_reset;
275813dff13SHelge Deller     mc->block_default_type = IF_SCSI;
276*a72bd606SHelge Deller     mc->max_cpus = HPPA_MAX_CPUS;
277*a72bd606SHelge Deller     mc->default_cpus = 1;
278813dff13SHelge Deller     mc->is_default = 1;
279813dff13SHelge Deller     mc->default_ram_size = 512 * M_BYTE;
280813dff13SHelge Deller     mc->default_boot_order = "cd";
281813dff13SHelge Deller }
282813dff13SHelge Deller 
283813dff13SHelge Deller DEFINE_MACHINE("hppa", machine_hppa_machine_init)
284