ppc/pnv: extend the machine with a XICSFabric interface
A XICSFabric QOM interface is used by the XICS layer to manipulate the ICP and ICS objects. Let's define the associated handlers for the PowerNV machine. All handlers should be defined even if there is no ICS under the PowerNV machine yet. Signed-off-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
99285aae16
commit
36fc6f0800
30
hw/ppc/pnv.c
30
hw/ppc/pnv.c
|
@ -34,6 +34,7 @@
|
|||
#include "qemu/cutils.h"
|
||||
#include "qapi/visitor.h"
|
||||
|
||||
#include "hw/ppc/xics.h"
|
||||
#include "hw/ppc/pnv_xscom.h"
|
||||
|
||||
#include "hw/isa/isa.h"
|
||||
|
@ -738,6 +739,29 @@ static const TypeInfo pnv_chip_info = {
|
|||
.abstract = true,
|
||||
};
|
||||
|
||||
static PowerPCCPU *ppc_get_vcpu_by_pir(int pir)
|
||||
{
|
||||
CPUState *cs;
|
||||
|
||||
CPU_FOREACH(cs) {
|
||||
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||
CPUPPCState *env = &cpu->env;
|
||||
|
||||
if (env->spr_cb[SPR_PIR].default_value == pir) {
|
||||
return cpu;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ICPState *pnv_icp_get(XICSFabric *xi, int pir)
|
||||
{
|
||||
PowerPCCPU *cpu = ppc_get_vcpu_by_pir(pir);
|
||||
|
||||
return cpu ? ICP(cpu->intc) : NULL;
|
||||
}
|
||||
|
||||
static void pnv_get_num_chips(Object *obj, Visitor *v, const char *name,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
|
@ -788,6 +812,7 @@ static void powernv_machine_class_props_init(ObjectClass *oc)
|
|||
static void powernv_machine_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
XICSFabricClass *xic = XICS_FABRIC_CLASS(oc);
|
||||
|
||||
mc->desc = "IBM PowerNV (Non-Virtualized)";
|
||||
mc->init = ppc_powernv_init;
|
||||
|
@ -798,6 +823,7 @@ static void powernv_machine_class_init(ObjectClass *oc, void *data)
|
|||
mc->no_parallel = 1;
|
||||
mc->default_boot_order = NULL;
|
||||
mc->default_ram_size = 1 * G_BYTE;
|
||||
xic->icp_get = pnv_icp_get;
|
||||
|
||||
powernv_machine_class_props_init(oc);
|
||||
}
|
||||
|
@ -808,6 +834,10 @@ static const TypeInfo powernv_machine_info = {
|
|||
.instance_size = sizeof(PnvMachineState),
|
||||
.instance_init = powernv_machine_initfn,
|
||||
.class_init = powernv_machine_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_XICS_FABRIC },
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static void powernv_machine_register_types(void)
|
||||
|
|
Loading…
Reference in a new issue