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