| /* | 
 |  * Test Machine for the IBM PPE42 processor | 
 |  * | 
 |  * Copyright (c) 2025, IBM Corporation. | 
 |  * | 
 |  * SPDX-License-Identifier: GPL-2.0-or-later | 
 |  */ | 
 |  | 
 | #include "qemu/osdep.h" | 
 | #include "qemu/units.h" | 
 | #include "qemu/error-report.h" | 
 | #include "system/address-spaces.h" | 
 | #include "hw/boards.h" | 
 | #include "hw/ppc/ppc.h" | 
 | #include "system/system.h" | 
 | #include "system/reset.h" | 
 | #include "system/kvm.h" | 
 | #include "qapi/error.h" | 
 |  | 
 | #define TYPE_PPE42_MACHINE MACHINE_TYPE_NAME("ppe42_machine") | 
 | typedef MachineClass Ppe42MachineClass; | 
 | typedef struct Ppe42MachineState Ppe42MachineState; | 
 | DECLARE_OBJ_CHECKERS(Ppe42MachineState, Ppe42MachineClass, | 
 |                      PPE42_MACHINE, TYPE_PPE42_MACHINE) | 
 |  | 
 | struct Ppe42MachineState { | 
 |     MachineState parent_obj; | 
 |  | 
 |     PowerPCCPU cpu; | 
 | }; | 
 |  | 
 | static void main_cpu_reset(void *opaque) | 
 | { | 
 |     PowerPCCPU *cpu = opaque; | 
 |  | 
 |     cpu_reset(CPU(cpu)); | 
 | } | 
 |  | 
 | static void ppe42_machine_init(MachineState *machine) | 
 | { | 
 |     Ppe42MachineState *pms = PPE42_MACHINE(machine); | 
 |     PowerPCCPU *cpu = &pms->cpu; | 
 |  | 
 |     if (kvm_enabled()) { | 
 |         error_report("machine %s does not support the KVM accelerator", | 
 |                      MACHINE_GET_CLASS(machine)->name); | 
 |         exit(EXIT_FAILURE); | 
 |     } | 
 |     if (machine->ram_size > 512 * KiB) { | 
 |         error_report("RAM size more than 512 KiB is not supported"); | 
 |         exit(1); | 
 |     } | 
 |  | 
 |     /* init CPU */ | 
 |     object_initialize_child(OBJECT(pms), "cpu", cpu, machine->cpu_type); | 
 |     if (!qdev_realize(DEVICE(cpu), NULL, &error_fatal)) { | 
 |         return; | 
 |     } | 
 |  | 
 |     qemu_register_reset(main_cpu_reset, cpu); | 
 |  | 
 |     /* This sets the decrementer timebase */ | 
 |     ppc_booke_timers_init(cpu, 37500000, PPC_TIMER_PPE); | 
 |  | 
 |     /* RAM */ | 
 |     memory_region_add_subregion(get_system_memory(), 0xfff80000, machine->ram); | 
 | } | 
 |  | 
 |  | 
 | static void ppe42_machine_class_init(ObjectClass *oc, const void *data) | 
 | { | 
 |     MachineClass *mc = MACHINE_CLASS(oc); | 
 |     static const char * const valid_cpu_types[] = { | 
 |         POWERPC_CPU_TYPE_NAME("PPE42"), | 
 |         POWERPC_CPU_TYPE_NAME("PPE42X"), | 
 |         POWERPC_CPU_TYPE_NAME("PPE42XM"), | 
 |         NULL, | 
 |     }; | 
 |  | 
 |     mc->desc = "PPE42 Test Machine"; | 
 |     mc->init = ppe42_machine_init; | 
 |     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("PPE42XM"); | 
 |     mc->valid_cpu_types = valid_cpu_types; | 
 |     mc->default_ram_id = "ram"; | 
 |     mc->default_ram_size = 512 * KiB; | 
 | } | 
 |  | 
 | static const TypeInfo ppe42_machine_info = { | 
 |         .name          = TYPE_PPE42_MACHINE, | 
 |         .parent        = TYPE_MACHINE, | 
 |         .instance_size = sizeof(Ppe42MachineState), | 
 |         .class_init    = ppe42_machine_class_init, | 
 |         .class_size    = sizeof(Ppe42MachineClass), | 
 | }; | 
 |  | 
 | static void ppe42_machine_register_types(void) | 
 | { | 
 |     type_register_static(&ppe42_machine_info); | 
 | } | 
 |  | 
 | type_init(ppe42_machine_register_types); |