Browse Source
Adds a test machine for the IBM PPE42 processor, including a DEC, FIT, WDT and 512 KiB of ram. The purpose of this machine is only to provide a generic platform for testing instructions of the recently added PPE42 processor model which is used extensively in the IBM Power9, Power10 and future Power server processors. Signed-off-by: Glenn Miles <milesg@linux.ibm.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com> Link: https://lore.kernel.org/r/20250925201758.652077-9-milesg@linux.ibm.com Message-ID: <20250925201758.652077-9-milesg@linux.ibm.com>pull/305/head
committed by
Harsh Prateek Bora
4 changed files with 114 additions and 0 deletions
@ -0,0 +1,101 @@ |
|||
/*
|
|||
* 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); |
|||
Loading…
Reference in new issue