ppc/pnv: Add a OCC model for POWER10
Our OCC model is very mininal and POWER10 can simply reuse the OCC model we introduced for POWER9. Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
da71b7e3ed
commit
8bf682a349
10
hw/ppc/pnv.c
10
hw/ppc/pnv.c
@ -1582,6 +1582,7 @@ static void pnv_chip_power10_instance_init(Object *obj)
|
||||
"xive-fabric");
|
||||
object_initialize_child(obj, "psi", &chip10->psi, TYPE_PNV10_PSI);
|
||||
object_initialize_child(obj, "lpc", &chip10->lpc, TYPE_PNV10_LPC);
|
||||
object_initialize_child(obj, "occ", &chip10->occ, TYPE_PNV10_OCC);
|
||||
}
|
||||
|
||||
static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
|
||||
@ -1647,6 +1648,15 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
|
||||
chip->fw_mr = &chip10->lpc.isa_fw;
|
||||
chip->dt_isa_nodename = g_strdup_printf("/lpcm-opb@%" PRIx64 "/lpc@0",
|
||||
(uint64_t) PNV10_LPCM_BASE(chip));
|
||||
|
||||
/* Create the simplified OCC model */
|
||||
object_property_set_link(OBJECT(&chip10->occ), "psi", OBJECT(&chip10->psi),
|
||||
&error_abort);
|
||||
if (!qdev_realize(DEVICE(&chip10->occ), NULL, errp)) {
|
||||
return;
|
||||
}
|
||||
pnv_xscom_add_subregion(chip, PNV10_XSCOM_OCC_BASE,
|
||||
&chip10->occ.xscom_regs);
|
||||
}
|
||||
|
||||
static uint32_t pnv_chip_power10_xscom_pcba(PnvChip *chip, uint64_t addr)
|
||||
|
@ -236,7 +236,9 @@ static const MemoryRegionOps pnv_occ_power9_xscom_ops = {
|
||||
static void pnv_occ_power9_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
PnvOCCClass *poc = PNV_OCC_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->desc = "PowerNV OCC Controller (POWER9)";
|
||||
poc->xscom_size = PNV9_XSCOM_OCC_SIZE;
|
||||
poc->xscom_ops = &pnv_occ_power9_xscom_ops;
|
||||
poc->psi_irq = PSIHB9_IRQ_OCC;
|
||||
@ -249,6 +251,19 @@ static const TypeInfo pnv_occ_power9_type_info = {
|
||||
.class_init = pnv_occ_power9_class_init,
|
||||
};
|
||||
|
||||
static void pnv_occ_power10_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->desc = "PowerNV OCC Controller (POWER10)";
|
||||
}
|
||||
|
||||
static const TypeInfo pnv_occ_power10_type_info = {
|
||||
.name = TYPE_PNV10_OCC,
|
||||
.parent = TYPE_PNV9_OCC,
|
||||
.class_init = pnv_occ_power10_class_init,
|
||||
};
|
||||
|
||||
static void pnv_occ_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
PnvOCC *occ = PNV_OCC(dev);
|
||||
@ -297,6 +312,7 @@ static void pnv_occ_register_types(void)
|
||||
type_register_static(&pnv_occ_type_info);
|
||||
type_register_static(&pnv_occ_power8_type_info);
|
||||
type_register_static(&pnv_occ_power9_type_info);
|
||||
type_register_static(&pnv_occ_power10_type_info);
|
||||
}
|
||||
|
||||
type_init(pnv_occ_register_types);
|
||||
|
@ -128,6 +128,7 @@ struct Pnv10Chip {
|
||||
PnvXive2 xive;
|
||||
Pnv9Psi psi;
|
||||
PnvLpcController lpc;
|
||||
PnvOCC occ;
|
||||
};
|
||||
|
||||
#define PNV10_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf)
|
||||
|
@ -32,6 +32,8 @@ DECLARE_INSTANCE_CHECKER(PnvOCC, PNV8_OCC,
|
||||
#define TYPE_PNV9_OCC TYPE_PNV_OCC "-POWER9"
|
||||
DECLARE_INSTANCE_CHECKER(PnvOCC, PNV9_OCC,
|
||||
TYPE_PNV9_OCC)
|
||||
#define TYPE_PNV10_OCC TYPE_PNV_OCC "-POWER10"
|
||||
DECLARE_INSTANCE_CHECKER(PnvOCC, PNV10_OCC, TYPE_PNV10_OCC)
|
||||
|
||||
#define PNV_OCC_SENSOR_DATA_BLOCK_OFFSET 0x00580000
|
||||
#define PNV_OCC_SENSOR_DATA_BLOCK_SIZE 0x00025800
|
||||
|
@ -131,6 +131,9 @@ struct PnvXScomInterfaceClass {
|
||||
#define PNV10_XSCOM_PSIHB_BASE 0x3011D00
|
||||
#define PNV10_XSCOM_PSIHB_SIZE 0x100
|
||||
|
||||
#define PNV10_XSCOM_OCC_BASE PNV9_XSCOM_OCC_BASE
|
||||
#define PNV10_XSCOM_OCC_SIZE PNV9_XSCOM_OCC_SIZE
|
||||
|
||||
#define PNV10_XSCOM_XIVE2_BASE 0x2010800
|
||||
#define PNV10_XSCOM_XIVE2_SIZE 0x400
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user