1d9656f86SBALATON Zoltan /* 2d9656f86SBALATON Zoltan * QEMU Eyetech AmigaOne/Mai Logic Teron emulation 3d9656f86SBALATON Zoltan * 4d9656f86SBALATON Zoltan * Copyright (c) 2023 BALATON Zoltan 5d9656f86SBALATON Zoltan * 6d9656f86SBALATON Zoltan * This work is licensed under the GNU GPL license version 2 or later. 7d9656f86SBALATON Zoltan * 8d9656f86SBALATON Zoltan */ 9d9656f86SBALATON Zoltan 10d9656f86SBALATON Zoltan #include "qemu/osdep.h" 11d9656f86SBALATON Zoltan #include "qemu/units.h" 12d9656f86SBALATON Zoltan #include "qemu/datadir.h" 13d9656f86SBALATON Zoltan #include "qemu/log.h" 14d9656f86SBALATON Zoltan #include "qemu/error-report.h" 15d9656f86SBALATON Zoltan #include "qapi/error.h" 16d9656f86SBALATON Zoltan #include "hw/ppc/ppc.h" 17d9656f86SBALATON Zoltan #include "hw/boards.h" 18d9656f86SBALATON Zoltan #include "hw/loader.h" 19d9656f86SBALATON Zoltan #include "hw/pci-host/articia.h" 20d9656f86SBALATON Zoltan #include "hw/isa/vt82c686.h" 21d9656f86SBALATON Zoltan #include "hw/ide/pci.h" 22d9656f86SBALATON Zoltan #include "hw/i2c/smbus_eeprom.h" 23d9656f86SBALATON Zoltan #include "hw/ppc/ppc.h" 24addff513SBALATON Zoltan #include "system/block-backend.h" 2532cad1ffSPhilippe Mathieu-Daudé #include "system/qtest.h" 2632cad1ffSPhilippe Mathieu-Daudé #include "system/reset.h" 27d9656f86SBALATON Zoltan #include "kvm_ppc.h" 28*34f053d8SBALATON Zoltan #include "elf.h" 29d9656f86SBALATON Zoltan 30addff513SBALATON Zoltan #include <zlib.h> /* for crc32 */ 31addff513SBALATON Zoltan 32d9656f86SBALATON Zoltan #define BUS_FREQ_HZ 100000000 33d9656f86SBALATON Zoltan 34*34f053d8SBALATON Zoltan #define INITRD_MIN_ADDR 0x600000 35*34f053d8SBALATON Zoltan 36d9656f86SBALATON Zoltan /* 37d9656f86SBALATON Zoltan * Firmware binary available at 38d9656f86SBALATON Zoltan * https://www.hyperion-entertainment.com/index.php/downloads?view=files&parent=28 39d9656f86SBALATON Zoltan * then "tail -c 524288 updater.image >u-boot-amigaone.bin" 40d9656f86SBALATON Zoltan * 41d9656f86SBALATON Zoltan * BIOS emulator in firmware cannot run QEMU vgabios and hangs on it, use 42d9656f86SBALATON Zoltan * -device VGA,romfile=VGABIOS-lgpl-latest.bin 43d9656f86SBALATON Zoltan * from http://www.nongnu.org/vgabios/ instead. 44d9656f86SBALATON Zoltan */ 45d9656f86SBALATON Zoltan #define PROM_ADDR 0xfff00000 46d9656f86SBALATON Zoltan #define PROM_SIZE (512 * KiB) 47d9656f86SBALATON Zoltan 48e25acd61SBALATON Zoltan /* AmigaOS calls this routine from ROM, use this if no firmware loaded */ 49e25acd61SBALATON Zoltan static const char dummy_fw[] = { 50222d37d3SBALATON Zoltan 0x54, 0x63, 0xc2, 0x3e, /* srwi r3,r3,8 */ 51e25acd61SBALATON Zoltan 0x7c, 0x63, 0x18, 0xf8, /* not r3,r3 */ 52e25acd61SBALATON Zoltan 0x4e, 0x80, 0x00, 0x20, /* blr */ 53e25acd61SBALATON Zoltan }; 54e25acd61SBALATON Zoltan 55addff513SBALATON Zoltan #define NVRAM_ADDR 0xfd0e0000 56addff513SBALATON Zoltan #define NVRAM_SIZE (4 * KiB) 57addff513SBALATON Zoltan 58c2bed995SBALATON Zoltan static char default_env[] = 59c2bed995SBALATON Zoltan "baudrate=115200\0" 60c2bed995SBALATON Zoltan "stdout=vga\0" 61c2bed995SBALATON Zoltan "stdin=ps2kbd\0" 62c2bed995SBALATON Zoltan "bootcmd=boota; menu; run menuboot_cmd\0" 63c2bed995SBALATON Zoltan "boot1=ide\0" 64c2bed995SBALATON Zoltan "boot2=cdrom\0" 65c2bed995SBALATON Zoltan "boota_timeout=3\0" 66c2bed995SBALATON Zoltan "ide_doreset=on\0" 67c2bed995SBALATON Zoltan "pci_irqa=9\0" 68c2bed995SBALATON Zoltan "pci_irqa_select=level\0" 69c2bed995SBALATON Zoltan "pci_irqb=10\0" 70c2bed995SBALATON Zoltan "pci_irqb_select=level\0" 71c2bed995SBALATON Zoltan "pci_irqc=11\0" 72c2bed995SBALATON Zoltan "pci_irqc_select=level\0" 73c2bed995SBALATON Zoltan "pci_irqd=7\0" 74c2bed995SBALATON Zoltan "pci_irqd_select=level\0" 75c2bed995SBALATON Zoltan "a1ide_irq=1111\0" 76c2bed995SBALATON Zoltan "a1ide_xfer=FFFF\0"; 77c2bed995SBALATON Zoltan #define CRC32_DEFAULT_ENV 0xb5548481 78c2bed995SBALATON Zoltan #define CRC32_ALL_ZEROS 0x603b0489 79c2bed995SBALATON Zoltan 80addff513SBALATON Zoltan #define TYPE_A1_NVRAM "a1-nvram" 81addff513SBALATON Zoltan OBJECT_DECLARE_SIMPLE_TYPE(A1NVRAMState, A1_NVRAM) 82addff513SBALATON Zoltan 83addff513SBALATON Zoltan struct A1NVRAMState { 84addff513SBALATON Zoltan SysBusDevice parent_obj; 85addff513SBALATON Zoltan 86addff513SBALATON Zoltan MemoryRegion mr; 87addff513SBALATON Zoltan BlockBackend *blk; 88addff513SBALATON Zoltan }; 89addff513SBALATON Zoltan 90addff513SBALATON Zoltan static uint64_t nvram_read(void *opaque, hwaddr addr, unsigned int size) 91addff513SBALATON Zoltan { 92addff513SBALATON Zoltan /* read callback not used because of romd mode */ 93addff513SBALATON Zoltan g_assert_not_reached(); 94addff513SBALATON Zoltan } 95addff513SBALATON Zoltan 96addff513SBALATON Zoltan static void nvram_write(void *opaque, hwaddr addr, uint64_t val, 97addff513SBALATON Zoltan unsigned int size) 98addff513SBALATON Zoltan { 99addff513SBALATON Zoltan A1NVRAMState *s = opaque; 100addff513SBALATON Zoltan uint8_t *p = memory_region_get_ram_ptr(&s->mr); 101addff513SBALATON Zoltan 102addff513SBALATON Zoltan p[addr] = val; 103addff513SBALATON Zoltan if (s->blk) { 104addff513SBALATON Zoltan blk_pwrite(s->blk, addr, 1, &val, 0); 105addff513SBALATON Zoltan } 106addff513SBALATON Zoltan } 107addff513SBALATON Zoltan 108addff513SBALATON Zoltan static const MemoryRegionOps nvram_ops = { 109addff513SBALATON Zoltan .read = nvram_read, 110addff513SBALATON Zoltan .write = nvram_write, 111addff513SBALATON Zoltan .endianness = DEVICE_BIG_ENDIAN, 112addff513SBALATON Zoltan .impl = { 113addff513SBALATON Zoltan .min_access_size = 1, 114addff513SBALATON Zoltan .max_access_size = 1, 115addff513SBALATON Zoltan }, 116addff513SBALATON Zoltan }; 117addff513SBALATON Zoltan 118addff513SBALATON Zoltan static void nvram_realize(DeviceState *dev, Error **errp) 119addff513SBALATON Zoltan { 120addff513SBALATON Zoltan A1NVRAMState *s = A1_NVRAM(dev); 121addff513SBALATON Zoltan void *p; 122c2bed995SBALATON Zoltan uint32_t crc, *c; 123addff513SBALATON Zoltan 124addff513SBALATON Zoltan memory_region_init_rom_device(&s->mr, NULL, &nvram_ops, s, "nvram", 125addff513SBALATON Zoltan NVRAM_SIZE, &error_fatal); 126addff513SBALATON Zoltan sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mr); 127addff513SBALATON Zoltan c = p = memory_region_get_ram_ptr(&s->mr); 128addff513SBALATON Zoltan if (s->blk) { 129addff513SBALATON Zoltan if (blk_getlength(s->blk) != NVRAM_SIZE) { 130addff513SBALATON Zoltan error_setg(errp, "NVRAM backing file size must be %" PRId64 "bytes", 131addff513SBALATON Zoltan NVRAM_SIZE); 132addff513SBALATON Zoltan return; 133addff513SBALATON Zoltan } 134addff513SBALATON Zoltan blk_set_perm(s->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE, 135addff513SBALATON Zoltan BLK_PERM_ALL, &error_fatal); 136addff513SBALATON Zoltan if (blk_pread(s->blk, 0, NVRAM_SIZE, p, 0) < 0) { 137addff513SBALATON Zoltan error_setg(errp, "Cannot read NVRAM contents from backing file"); 138addff513SBALATON Zoltan return; 139addff513SBALATON Zoltan } 140addff513SBALATON Zoltan } 141c2bed995SBALATON Zoltan crc = crc32(0, p + 4, NVRAM_SIZE - 4); 142c2bed995SBALATON Zoltan if (crc == CRC32_ALL_ZEROS) { /* If env is uninitialized set default */ 143c2bed995SBALATON Zoltan *c = cpu_to_be32(CRC32_DEFAULT_ENV); 144c2bed995SBALATON Zoltan /* Also copies terminating \0 as env is terminated by \0\0 */ 145c2bed995SBALATON Zoltan memcpy(p + 4, default_env, sizeof(default_env)); 146c2bed995SBALATON Zoltan if (s->blk) { 147c2bed995SBALATON Zoltan blk_pwrite(s->blk, 0, sizeof(crc) + sizeof(default_env), p, 0); 148c2bed995SBALATON Zoltan } 149c2bed995SBALATON Zoltan return; 150c2bed995SBALATON Zoltan } 151addff513SBALATON Zoltan if (*c == 0) { 152addff513SBALATON Zoltan *c = cpu_to_be32(crc32(0, p + 4, NVRAM_SIZE - 4)); 153addff513SBALATON Zoltan if (s->blk) { 154addff513SBALATON Zoltan blk_pwrite(s->blk, 0, 4, p, 0); 155addff513SBALATON Zoltan } 156addff513SBALATON Zoltan } 157c2bed995SBALATON Zoltan if (be32_to_cpu(*c) != crc) { 158c2bed995SBALATON Zoltan warn_report("NVRAM checksum mismatch"); 159c2bed995SBALATON Zoltan } 160addff513SBALATON Zoltan } 161addff513SBALATON Zoltan 162addff513SBALATON Zoltan static const Property nvram_properties[] = { 163addff513SBALATON Zoltan DEFINE_PROP_DRIVE("drive", A1NVRAMState, blk), 164addff513SBALATON Zoltan }; 165addff513SBALATON Zoltan 166addff513SBALATON Zoltan static void nvram_class_init(ObjectClass *oc, void *data) 167addff513SBALATON Zoltan { 168addff513SBALATON Zoltan DeviceClass *dc = DEVICE_CLASS(oc); 169addff513SBALATON Zoltan 170addff513SBALATON Zoltan dc->realize = nvram_realize; 171addff513SBALATON Zoltan device_class_set_props(dc, nvram_properties); 172addff513SBALATON Zoltan } 173addff513SBALATON Zoltan 174addff513SBALATON Zoltan static const TypeInfo nvram_types[] = { 175addff513SBALATON Zoltan { 176addff513SBALATON Zoltan .name = TYPE_A1_NVRAM, 177addff513SBALATON Zoltan .parent = TYPE_SYS_BUS_DEVICE, 178addff513SBALATON Zoltan .instance_size = sizeof(A1NVRAMState), 179addff513SBALATON Zoltan .class_init = nvram_class_init, 180addff513SBALATON Zoltan }, 181addff513SBALATON Zoltan }; 182addff513SBALATON Zoltan DEFINE_TYPES(nvram_types) 183addff513SBALATON Zoltan 184*34f053d8SBALATON Zoltan struct boot_info { 185*34f053d8SBALATON Zoltan hwaddr entry; 186*34f053d8SBALATON Zoltan hwaddr stack; 187*34f053d8SBALATON Zoltan hwaddr bd_info; 188*34f053d8SBALATON Zoltan hwaddr initrd_start; 189*34f053d8SBALATON Zoltan hwaddr initrd_end; 190*34f053d8SBALATON Zoltan hwaddr cmdline_start; 191*34f053d8SBALATON Zoltan hwaddr cmdline_end; 192*34f053d8SBALATON Zoltan }; 193*34f053d8SBALATON Zoltan 194*34f053d8SBALATON Zoltan /* Board info struct from U-Boot */ 195*34f053d8SBALATON Zoltan struct bd_info { 196*34f053d8SBALATON Zoltan uint32_t bi_memstart; 197*34f053d8SBALATON Zoltan uint32_t bi_memsize; 198*34f053d8SBALATON Zoltan uint32_t bi_flashstart; 199*34f053d8SBALATON Zoltan uint32_t bi_flashsize; 200*34f053d8SBALATON Zoltan uint32_t bi_flashoffset; 201*34f053d8SBALATON Zoltan uint32_t bi_sramstart; 202*34f053d8SBALATON Zoltan uint32_t bi_sramsize; 203*34f053d8SBALATON Zoltan uint32_t bi_bootflags; 204*34f053d8SBALATON Zoltan uint32_t bi_ip_addr; 205*34f053d8SBALATON Zoltan uint8_t bi_enetaddr[6]; 206*34f053d8SBALATON Zoltan uint16_t bi_ethspeed; 207*34f053d8SBALATON Zoltan uint32_t bi_intfreq; 208*34f053d8SBALATON Zoltan uint32_t bi_busfreq; 209*34f053d8SBALATON Zoltan uint32_t bi_baudrate; 210*34f053d8SBALATON Zoltan } QEMU_PACKED; 211*34f053d8SBALATON Zoltan 212*34f053d8SBALATON Zoltan static void create_bd_info(hwaddr addr, ram_addr_t ram_size) 213*34f053d8SBALATON Zoltan { 214*34f053d8SBALATON Zoltan struct bd_info *bd = g_new0(struct bd_info, 1); 215*34f053d8SBALATON Zoltan 216*34f053d8SBALATON Zoltan bd->bi_memsize = cpu_to_be32(ram_size); 217*34f053d8SBALATON Zoltan bd->bi_flashstart = cpu_to_be32(PROM_ADDR); 218*34f053d8SBALATON Zoltan bd->bi_flashsize = cpu_to_be32(1); /* match what U-Boot detects */ 219*34f053d8SBALATON Zoltan bd->bi_bootflags = cpu_to_be32(1); 220*34f053d8SBALATON Zoltan bd->bi_intfreq = cpu_to_be32(11.5 * BUS_FREQ_HZ); 221*34f053d8SBALATON Zoltan bd->bi_busfreq = cpu_to_be32(BUS_FREQ_HZ); 222*34f053d8SBALATON Zoltan bd->bi_baudrate = cpu_to_be32(115200); 223*34f053d8SBALATON Zoltan 224*34f053d8SBALATON Zoltan cpu_physical_memory_write(addr, bd, sizeof(*bd)); 225*34f053d8SBALATON Zoltan } 226*34f053d8SBALATON Zoltan 227d9656f86SBALATON Zoltan static void amigaone_cpu_reset(void *opaque) 228d9656f86SBALATON Zoltan { 229d9656f86SBALATON Zoltan PowerPCCPU *cpu = opaque; 230*34f053d8SBALATON Zoltan CPUPPCState *env = &cpu->env; 231d9656f86SBALATON Zoltan 232d9656f86SBALATON Zoltan cpu_reset(CPU(cpu)); 233*34f053d8SBALATON Zoltan if (env->load_info) { 234*34f053d8SBALATON Zoltan struct boot_info *bi = env->load_info; 235*34f053d8SBALATON Zoltan 236*34f053d8SBALATON Zoltan env->gpr[1] = bi->stack; 237*34f053d8SBALATON Zoltan env->gpr[2] = 1024; 238*34f053d8SBALATON Zoltan env->gpr[3] = bi->bd_info; 239*34f053d8SBALATON Zoltan env->gpr[4] = bi->initrd_start; 240*34f053d8SBALATON Zoltan env->gpr[5] = bi->initrd_end; 241*34f053d8SBALATON Zoltan env->gpr[6] = bi->cmdline_start; 242*34f053d8SBALATON Zoltan env->gpr[7] = bi->cmdline_end; 243*34f053d8SBALATON Zoltan env->nip = bi->entry; 244*34f053d8SBALATON Zoltan } 245*34f053d8SBALATON Zoltan cpu_ppc_tb_reset(env); 246d9656f86SBALATON Zoltan } 247d9656f86SBALATON Zoltan 248d9656f86SBALATON Zoltan static void fix_spd_data(uint8_t *spd) 249d9656f86SBALATON Zoltan { 250d9656f86SBALATON Zoltan uint32_t bank_size = 4 * MiB * spd[31]; 251d9656f86SBALATON Zoltan uint32_t rows = bank_size / spd[13] / spd[17]; 252d9656f86SBALATON Zoltan spd[3] = ctz32(rows) - spd[4]; 253d9656f86SBALATON Zoltan } 254d9656f86SBALATON Zoltan 255d9656f86SBALATON Zoltan static void amigaone_init(MachineState *machine) 256d9656f86SBALATON Zoltan { 257d9656f86SBALATON Zoltan PowerPCCPU *cpu; 258d9656f86SBALATON Zoltan CPUPPCState *env; 259d9656f86SBALATON Zoltan MemoryRegion *rom, *pci_mem, *mr; 260d9656f86SBALATON Zoltan ssize_t sz; 261d9656f86SBALATON Zoltan PCIBus *pci_bus; 262d9656f86SBALATON Zoltan Object *via; 263d9656f86SBALATON Zoltan DeviceState *dev; 264d9656f86SBALATON Zoltan I2CBus *i2c_bus; 265d9656f86SBALATON Zoltan uint8_t *spd_data; 266addff513SBALATON Zoltan DriveInfo *di; 267*34f053d8SBALATON Zoltan hwaddr loadaddr; 268*34f053d8SBALATON Zoltan struct boot_info *bi = NULL; 269d9656f86SBALATON Zoltan 270d9656f86SBALATON Zoltan /* init CPU */ 271d9656f86SBALATON Zoltan cpu = POWERPC_CPU(cpu_create(machine->cpu_type)); 272d9656f86SBALATON Zoltan env = &cpu->env; 273d9656f86SBALATON Zoltan if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) { 274d9656f86SBALATON Zoltan error_report("Incompatible CPU, only 6xx bus supported"); 275d9656f86SBALATON Zoltan exit(1); 276d9656f86SBALATON Zoltan } 277d9656f86SBALATON Zoltan cpu_ppc_tb_init(env, BUS_FREQ_HZ / 4); 278d9656f86SBALATON Zoltan qemu_register_reset(amigaone_cpu_reset, cpu); 279d9656f86SBALATON Zoltan 280d9656f86SBALATON Zoltan /* RAM */ 281d9656f86SBALATON Zoltan if (machine->ram_size > 2 * GiB) { 282d9656f86SBALATON Zoltan error_report("RAM size more than 2 GiB is not supported"); 283d9656f86SBALATON Zoltan exit(1); 284d9656f86SBALATON Zoltan } 285d9656f86SBALATON Zoltan memory_region_add_subregion(get_system_memory(), 0, machine->ram); 286d9656f86SBALATON Zoltan if (machine->ram_size < 1 * GiB + 32 * KiB) { 287d9656f86SBALATON Zoltan /* Firmware uses this area for startup */ 288d9656f86SBALATON Zoltan mr = g_new(MemoryRegion, 1); 289d9656f86SBALATON Zoltan memory_region_init_ram(mr, NULL, "init-cache", 32 * KiB, &error_fatal); 290d9656f86SBALATON Zoltan memory_region_add_subregion(get_system_memory(), 0x40000000, mr); 291d9656f86SBALATON Zoltan } 292d9656f86SBALATON Zoltan 293addff513SBALATON Zoltan /* nvram */ 294addff513SBALATON Zoltan dev = qdev_new(TYPE_A1_NVRAM); 295addff513SBALATON Zoltan di = drive_get(IF_MTD, 0, 0); 296addff513SBALATON Zoltan if (di) { 297addff513SBALATON Zoltan qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(di)); 298addff513SBALATON Zoltan } 299addff513SBALATON Zoltan sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); 300addff513SBALATON Zoltan memory_region_add_subregion(get_system_memory(), NVRAM_ADDR, 301addff513SBALATON Zoltan sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0)); 302addff513SBALATON Zoltan 303d9656f86SBALATON Zoltan /* allocate and load firmware */ 304d9656f86SBALATON Zoltan rom = g_new(MemoryRegion, 1); 305d9656f86SBALATON Zoltan memory_region_init_rom(rom, NULL, "rom", PROM_SIZE, &error_fatal); 306d9656f86SBALATON Zoltan memory_region_add_subregion(get_system_memory(), PROM_ADDR, rom); 307e25acd61SBALATON Zoltan if (!machine->firmware) { 308e25acd61SBALATON Zoltan rom_add_blob_fixed("dummy-fw", dummy_fw, sizeof(dummy_fw), 309e25acd61SBALATON Zoltan PROM_ADDR + PROM_SIZE - 0x80); 310e25acd61SBALATON Zoltan } else { 311e25acd61SBALATON Zoltan g_autofree char *filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, 312e25acd61SBALATON Zoltan machine->firmware); 313e25acd61SBALATON Zoltan if (!filename) { 314e25acd61SBALATON Zoltan error_report("Could not find firmware '%s'", machine->firmware); 315e25acd61SBALATON Zoltan exit(1); 316e25acd61SBALATON Zoltan } 317d9656f86SBALATON Zoltan sz = load_image_targphys(filename, PROM_ADDR, PROM_SIZE); 318d9656f86SBALATON Zoltan if (sz <= 0 || sz > PROM_SIZE) { 319d9656f86SBALATON Zoltan error_report("Could not load firmware '%s'", filename); 320d9656f86SBALATON Zoltan exit(1); 321d9656f86SBALATON Zoltan } 322d9656f86SBALATON Zoltan } 323d9656f86SBALATON Zoltan 324d9656f86SBALATON Zoltan /* Articia S */ 325d9656f86SBALATON Zoltan dev = sysbus_create_simple(TYPE_ARTICIA, 0xfe000000, NULL); 326d9656f86SBALATON Zoltan 327d9656f86SBALATON Zoltan i2c_bus = I2C_BUS(qdev_get_child_bus(dev, "smbus")); 328d9656f86SBALATON Zoltan if (machine->ram_size > 512 * MiB) { 329d9656f86SBALATON Zoltan spd_data = spd_data_generate(SDR, machine->ram_size / 2); 330d9656f86SBALATON Zoltan } else { 331d9656f86SBALATON Zoltan spd_data = spd_data_generate(SDR, machine->ram_size); 332d9656f86SBALATON Zoltan } 333d9656f86SBALATON Zoltan fix_spd_data(spd_data); 334d9656f86SBALATON Zoltan smbus_eeprom_init_one(i2c_bus, 0x51, spd_data); 335d9656f86SBALATON Zoltan if (machine->ram_size > 512 * MiB) { 336d9656f86SBALATON Zoltan smbus_eeprom_init_one(i2c_bus, 0x52, spd_data); 337d9656f86SBALATON Zoltan } 338d9656f86SBALATON Zoltan 339d9656f86SBALATON Zoltan pci_mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1); 340d9656f86SBALATON Zoltan mr = g_new(MemoryRegion, 1); 341d9656f86SBALATON Zoltan memory_region_init_alias(mr, OBJECT(dev), "pci-mem-low", pci_mem, 342addff513SBALATON Zoltan 0, 0xe0000); 343d9656f86SBALATON Zoltan memory_region_add_subregion(get_system_memory(), 0xfd000000, mr); 344d9656f86SBALATON Zoltan mr = g_new(MemoryRegion, 1); 345d9656f86SBALATON Zoltan memory_region_init_alias(mr, OBJECT(dev), "pci-mem-high", pci_mem, 346d9656f86SBALATON Zoltan 0x80000000, 0x7d000000); 347d9656f86SBALATON Zoltan memory_region_add_subregion(get_system_memory(), 0x80000000, mr); 348d9656f86SBALATON Zoltan pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0")); 349d9656f86SBALATON Zoltan 350d9656f86SBALATON Zoltan /* VIA VT82c686B South Bridge (multifunction PCI device) */ 351d9656f86SBALATON Zoltan via = OBJECT(pci_create_simple_multifunction(pci_bus, PCI_DEVFN(7, 0), 352d9656f86SBALATON Zoltan TYPE_VT82C686B_ISA)); 353d9656f86SBALATON Zoltan object_property_add_alias(OBJECT(machine), "rtc-time", 354d9656f86SBALATON Zoltan object_resolve_path_component(via, "rtc"), 355d9656f86SBALATON Zoltan "date"); 3569a365c25SBernhard Beschow qdev_connect_gpio_out_named(DEVICE(via), "intr", 0, 3579a365c25SBernhard Beschow qdev_get_gpio_in(DEVICE(cpu), 3589a365c25SBernhard Beschow PPC6xx_INPUT_INT)); 359addff513SBALATON Zoltan for (int i = 0; i < PCI_NUM_PINS; i++) { 360d9656f86SBALATON Zoltan qdev_connect_gpio_out(dev, i, qdev_get_gpio_in_named(DEVICE(via), 361d9656f86SBALATON Zoltan "pirq", i)); 362d9656f86SBALATON Zoltan } 363d9656f86SBALATON Zoltan pci_ide_create_devs(PCI_DEVICE(object_resolve_path_component(via, "ide"))); 364d9656f86SBALATON Zoltan pci_vga_init(pci_bus); 365*34f053d8SBALATON Zoltan 366*34f053d8SBALATON Zoltan if (!machine->kernel_filename) { 367*34f053d8SBALATON Zoltan return; 368*34f053d8SBALATON Zoltan } 369*34f053d8SBALATON Zoltan 370*34f053d8SBALATON Zoltan /* handle -kernel, -initrd, -append options and emulate U-Boot */ 371*34f053d8SBALATON Zoltan bi = g_new0(struct boot_info, 1); 372*34f053d8SBALATON Zoltan cpu->env.load_info = bi; 373*34f053d8SBALATON Zoltan 374*34f053d8SBALATON Zoltan loadaddr = MIN(machine->ram_size, 256 * MiB); 375*34f053d8SBALATON Zoltan bi->bd_info = loadaddr - 8 * MiB; 376*34f053d8SBALATON Zoltan create_bd_info(bi->bd_info, machine->ram_size); 377*34f053d8SBALATON Zoltan bi->stack = bi->bd_info - 64 * KiB - 8; 378*34f053d8SBALATON Zoltan 379*34f053d8SBALATON Zoltan if (machine->kernel_cmdline && machine->kernel_cmdline[0]) { 380*34f053d8SBALATON Zoltan size_t len = strlen(machine->kernel_cmdline); 381*34f053d8SBALATON Zoltan 382*34f053d8SBALATON Zoltan loadaddr = bi->bd_info + 1 * MiB; 383*34f053d8SBALATON Zoltan cpu_physical_memory_write(loadaddr, machine->kernel_cmdline, len + 1); 384*34f053d8SBALATON Zoltan bi->cmdline_start = loadaddr; 385*34f053d8SBALATON Zoltan bi->cmdline_end = loadaddr + len + 1; /* including terminating '\0' */ 386*34f053d8SBALATON Zoltan } 387*34f053d8SBALATON Zoltan 388*34f053d8SBALATON Zoltan sz = load_elf(machine->kernel_filename, NULL, NULL, NULL, 389*34f053d8SBALATON Zoltan &bi->entry, &loadaddr, NULL, NULL, 390*34f053d8SBALATON Zoltan ELFDATA2MSB, PPC_ELF_MACHINE, 0, 0); 391*34f053d8SBALATON Zoltan if (sz <= 0) { 392*34f053d8SBALATON Zoltan sz = load_uimage(machine->kernel_filename, &bi->entry, &loadaddr, 393*34f053d8SBALATON Zoltan NULL, NULL, NULL); 394*34f053d8SBALATON Zoltan } 395*34f053d8SBALATON Zoltan if (sz <= 0) { 396*34f053d8SBALATON Zoltan error_report("Could not load kernel '%s'", 397*34f053d8SBALATON Zoltan machine->kernel_filename); 398*34f053d8SBALATON Zoltan exit(1); 399*34f053d8SBALATON Zoltan } 400*34f053d8SBALATON Zoltan loadaddr += sz; 401*34f053d8SBALATON Zoltan 402*34f053d8SBALATON Zoltan if (machine->initrd_filename) { 403*34f053d8SBALATON Zoltan loadaddr = ROUND_UP(loadaddr + 4 * MiB, 4 * KiB); 404*34f053d8SBALATON Zoltan loadaddr = MAX(loadaddr, INITRD_MIN_ADDR); 405*34f053d8SBALATON Zoltan sz = load_image_targphys(machine->initrd_filename, loadaddr, 406*34f053d8SBALATON Zoltan bi->bd_info - loadaddr); 407*34f053d8SBALATON Zoltan if (sz <= 0) { 408*34f053d8SBALATON Zoltan error_report("Could not load initrd '%s'", 409*34f053d8SBALATON Zoltan machine->initrd_filename); 410*34f053d8SBALATON Zoltan exit(1); 411*34f053d8SBALATON Zoltan } 412*34f053d8SBALATON Zoltan bi->initrd_start = loadaddr; 413*34f053d8SBALATON Zoltan bi->initrd_end = loadaddr + sz; 414*34f053d8SBALATON Zoltan } 415d9656f86SBALATON Zoltan } 416d9656f86SBALATON Zoltan 417d9656f86SBALATON Zoltan static void amigaone_machine_init(MachineClass *mc) 418d9656f86SBALATON Zoltan { 419d9656f86SBALATON Zoltan mc->desc = "Eyetech AmigaOne/Mai Logic Teron"; 420d9656f86SBALATON Zoltan mc->init = amigaone_init; 421d9656f86SBALATON Zoltan mc->block_default_type = IF_IDE; 422d9656f86SBALATON Zoltan mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7457_v1.2"); 423d9656f86SBALATON Zoltan mc->default_display = "std"; 424d9656f86SBALATON Zoltan mc->default_ram_id = "ram"; 425d9656f86SBALATON Zoltan mc->default_ram_size = 512 * MiB; 426d9656f86SBALATON Zoltan } 427d9656f86SBALATON Zoltan 428d9656f86SBALATON Zoltan DEFINE_MACHINE("amigaone", amigaone_machine_init) 429