1*b773acf4SHavard Skinnemoen /* 2*b773acf4SHavard Skinnemoen * Machine definitions for boards featuring an NPCM7xx SoC. 3*b773acf4SHavard Skinnemoen * 4*b773acf4SHavard Skinnemoen * Copyright 2020 Google LLC 5*b773acf4SHavard Skinnemoen * 6*b773acf4SHavard Skinnemoen * This program is free software; you can redistribute it and/or modify it 7*b773acf4SHavard Skinnemoen * under the terms of the GNU General Public License as published by the 8*b773acf4SHavard Skinnemoen * Free Software Foundation; either version 2 of the License, or 9*b773acf4SHavard Skinnemoen * (at your option) any later version. 10*b773acf4SHavard Skinnemoen * 11*b773acf4SHavard Skinnemoen * This program is distributed in the hope that it will be useful, but WITHOUT 12*b773acf4SHavard Skinnemoen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*b773acf4SHavard Skinnemoen * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*b773acf4SHavard Skinnemoen * for more details. 15*b773acf4SHavard Skinnemoen */ 16*b773acf4SHavard Skinnemoen 17*b773acf4SHavard Skinnemoen #include "qemu/osdep.h" 18*b773acf4SHavard Skinnemoen 19*b773acf4SHavard Skinnemoen #include "exec/address-spaces.h" 20*b773acf4SHavard Skinnemoen #include "hw/arm/npcm7xx.h" 21*b773acf4SHavard Skinnemoen #include "hw/core/cpu.h" 22*b773acf4SHavard Skinnemoen #include "qapi/error.h" 23*b773acf4SHavard Skinnemoen #include "qemu/units.h" 24*b773acf4SHavard Skinnemoen 25*b773acf4SHavard Skinnemoen #define NPCM750_EVB_POWER_ON_STRAPS 0x00001ff7 26*b773acf4SHavard Skinnemoen #define QUANTA_GSJ_POWER_ON_STRAPS 0x00001fff 27*b773acf4SHavard Skinnemoen 28*b773acf4SHavard Skinnemoen static void npcm7xx_connect_dram(NPCM7xxState *soc, MemoryRegion *dram) 29*b773acf4SHavard Skinnemoen { 30*b773acf4SHavard Skinnemoen memory_region_add_subregion(get_system_memory(), NPCM7XX_DRAM_BA, dram); 31*b773acf4SHavard Skinnemoen 32*b773acf4SHavard Skinnemoen object_property_set_link(OBJECT(soc), "dram-mr", OBJECT(dram), 33*b773acf4SHavard Skinnemoen &error_abort); 34*b773acf4SHavard Skinnemoen } 35*b773acf4SHavard Skinnemoen 36*b773acf4SHavard Skinnemoen static NPCM7xxState *npcm7xx_create_soc(MachineState *machine, 37*b773acf4SHavard Skinnemoen uint32_t hw_straps) 38*b773acf4SHavard Skinnemoen { 39*b773acf4SHavard Skinnemoen NPCM7xxMachineClass *nmc = NPCM7XX_MACHINE_GET_CLASS(machine); 40*b773acf4SHavard Skinnemoen MachineClass *mc = &nmc->parent; 41*b773acf4SHavard Skinnemoen Object *obj; 42*b773acf4SHavard Skinnemoen 43*b773acf4SHavard Skinnemoen if (strcmp(machine->cpu_type, mc->default_cpu_type) != 0) { 44*b773acf4SHavard Skinnemoen error_report("This board can only be used with %s", 45*b773acf4SHavard Skinnemoen mc->default_cpu_type); 46*b773acf4SHavard Skinnemoen exit(1); 47*b773acf4SHavard Skinnemoen } 48*b773acf4SHavard Skinnemoen 49*b773acf4SHavard Skinnemoen obj = object_new_with_props(nmc->soc_type, OBJECT(machine), "soc", 50*b773acf4SHavard Skinnemoen &error_abort, NULL); 51*b773acf4SHavard Skinnemoen object_property_set_uint(obj, "power-on-straps", hw_straps, &error_abort); 52*b773acf4SHavard Skinnemoen 53*b773acf4SHavard Skinnemoen return NPCM7XX(obj); 54*b773acf4SHavard Skinnemoen } 55*b773acf4SHavard Skinnemoen 56*b773acf4SHavard Skinnemoen static void npcm750_evb_init(MachineState *machine) 57*b773acf4SHavard Skinnemoen { 58*b773acf4SHavard Skinnemoen NPCM7xxState *soc; 59*b773acf4SHavard Skinnemoen 60*b773acf4SHavard Skinnemoen soc = npcm7xx_create_soc(machine, NPCM750_EVB_POWER_ON_STRAPS); 61*b773acf4SHavard Skinnemoen npcm7xx_connect_dram(soc, machine->ram); 62*b773acf4SHavard Skinnemoen qdev_realize(DEVICE(soc), NULL, &error_fatal); 63*b773acf4SHavard Skinnemoen 64*b773acf4SHavard Skinnemoen npcm7xx_load_kernel(machine, soc); 65*b773acf4SHavard Skinnemoen } 66*b773acf4SHavard Skinnemoen 67*b773acf4SHavard Skinnemoen static void quanta_gsj_init(MachineState *machine) 68*b773acf4SHavard Skinnemoen { 69*b773acf4SHavard Skinnemoen NPCM7xxState *soc; 70*b773acf4SHavard Skinnemoen 71*b773acf4SHavard Skinnemoen soc = npcm7xx_create_soc(machine, QUANTA_GSJ_POWER_ON_STRAPS); 72*b773acf4SHavard Skinnemoen npcm7xx_connect_dram(soc, machine->ram); 73*b773acf4SHavard Skinnemoen qdev_realize(DEVICE(soc), NULL, &error_fatal); 74*b773acf4SHavard Skinnemoen 75*b773acf4SHavard Skinnemoen npcm7xx_load_kernel(machine, soc); 76*b773acf4SHavard Skinnemoen } 77*b773acf4SHavard Skinnemoen 78*b773acf4SHavard Skinnemoen static void npcm7xx_set_soc_type(NPCM7xxMachineClass *nmc, const char *type) 79*b773acf4SHavard Skinnemoen { 80*b773acf4SHavard Skinnemoen NPCM7xxClass *sc = NPCM7XX_CLASS(object_class_by_name(type)); 81*b773acf4SHavard Skinnemoen MachineClass *mc = MACHINE_CLASS(nmc); 82*b773acf4SHavard Skinnemoen 83*b773acf4SHavard Skinnemoen nmc->soc_type = type; 84*b773acf4SHavard Skinnemoen mc->default_cpus = mc->min_cpus = mc->max_cpus = sc->num_cpus; 85*b773acf4SHavard Skinnemoen } 86*b773acf4SHavard Skinnemoen 87*b773acf4SHavard Skinnemoen static void npcm7xx_machine_class_init(ObjectClass *oc, void *data) 88*b773acf4SHavard Skinnemoen { 89*b773acf4SHavard Skinnemoen MachineClass *mc = MACHINE_CLASS(oc); 90*b773acf4SHavard Skinnemoen 91*b773acf4SHavard Skinnemoen mc->no_floppy = 1; 92*b773acf4SHavard Skinnemoen mc->no_cdrom = 1; 93*b773acf4SHavard Skinnemoen mc->no_parallel = 1; 94*b773acf4SHavard Skinnemoen mc->default_ram_id = "ram"; 95*b773acf4SHavard Skinnemoen mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9"); 96*b773acf4SHavard Skinnemoen } 97*b773acf4SHavard Skinnemoen 98*b773acf4SHavard Skinnemoen /* 99*b773acf4SHavard Skinnemoen * Schematics: 100*b773acf4SHavard Skinnemoen * https://github.com/Nuvoton-Israel/nuvoton-info/blob/master/npcm7xx-poleg/evaluation-board/board_deliverables/NPCM750x_EB_ver.A1.1_COMPLETE.pdf 101*b773acf4SHavard Skinnemoen */ 102*b773acf4SHavard Skinnemoen static void npcm750_evb_machine_class_init(ObjectClass *oc, void *data) 103*b773acf4SHavard Skinnemoen { 104*b773acf4SHavard Skinnemoen NPCM7xxMachineClass *nmc = NPCM7XX_MACHINE_CLASS(oc); 105*b773acf4SHavard Skinnemoen MachineClass *mc = MACHINE_CLASS(oc); 106*b773acf4SHavard Skinnemoen 107*b773acf4SHavard Skinnemoen npcm7xx_set_soc_type(nmc, TYPE_NPCM750); 108*b773acf4SHavard Skinnemoen 109*b773acf4SHavard Skinnemoen mc->desc = "Nuvoton NPCM750 Evaluation Board (Cortex A9)"; 110*b773acf4SHavard Skinnemoen mc->init = npcm750_evb_init; 111*b773acf4SHavard Skinnemoen mc->default_ram_size = 512 * MiB; 112*b773acf4SHavard Skinnemoen }; 113*b773acf4SHavard Skinnemoen 114*b773acf4SHavard Skinnemoen static void gsj_machine_class_init(ObjectClass *oc, void *data) 115*b773acf4SHavard Skinnemoen { 116*b773acf4SHavard Skinnemoen NPCM7xxMachineClass *nmc = NPCM7XX_MACHINE_CLASS(oc); 117*b773acf4SHavard Skinnemoen MachineClass *mc = MACHINE_CLASS(oc); 118*b773acf4SHavard Skinnemoen 119*b773acf4SHavard Skinnemoen npcm7xx_set_soc_type(nmc, TYPE_NPCM730); 120*b773acf4SHavard Skinnemoen 121*b773acf4SHavard Skinnemoen mc->desc = "Quanta GSJ (Cortex A9)"; 122*b773acf4SHavard Skinnemoen mc->init = quanta_gsj_init; 123*b773acf4SHavard Skinnemoen mc->default_ram_size = 512 * MiB; 124*b773acf4SHavard Skinnemoen }; 125*b773acf4SHavard Skinnemoen 126*b773acf4SHavard Skinnemoen static const TypeInfo npcm7xx_machine_types[] = { 127*b773acf4SHavard Skinnemoen { 128*b773acf4SHavard Skinnemoen .name = TYPE_NPCM7XX_MACHINE, 129*b773acf4SHavard Skinnemoen .parent = TYPE_MACHINE, 130*b773acf4SHavard Skinnemoen .instance_size = sizeof(NPCM7xxMachine), 131*b773acf4SHavard Skinnemoen .class_size = sizeof(NPCM7xxMachineClass), 132*b773acf4SHavard Skinnemoen .class_init = npcm7xx_machine_class_init, 133*b773acf4SHavard Skinnemoen .abstract = true, 134*b773acf4SHavard Skinnemoen }, { 135*b773acf4SHavard Skinnemoen .name = MACHINE_TYPE_NAME("npcm750-evb"), 136*b773acf4SHavard Skinnemoen .parent = TYPE_NPCM7XX_MACHINE, 137*b773acf4SHavard Skinnemoen .class_init = npcm750_evb_machine_class_init, 138*b773acf4SHavard Skinnemoen }, { 139*b773acf4SHavard Skinnemoen .name = MACHINE_TYPE_NAME("quanta-gsj"), 140*b773acf4SHavard Skinnemoen .parent = TYPE_NPCM7XX_MACHINE, 141*b773acf4SHavard Skinnemoen .class_init = gsj_machine_class_init, 142*b773acf4SHavard Skinnemoen }, 143*b773acf4SHavard Skinnemoen }; 144*b773acf4SHavard Skinnemoen 145*b773acf4SHavard Skinnemoen DEFINE_TYPES(npcm7xx_machine_types) 146