@@ -32,6 +32,8 @@ OBJECT_DECLARE_TYPE(CortexMPPrivState, CortexMPPrivClass, CORTEX_MPCORE_PRIV)
struct CortexMPPrivClass {
SysBusDeviceClass parent_class;
+
+ DeviceRealize parent_realize;
};
struct CortexMPPrivState {
@@ -42,7 +44,7 @@ struct CortexMPPrivState {
OBJECT_DECLARE_SIMPLE_TYPE(A9MPPrivState, A9MPCORE_PRIV)
struct A9MPPrivState {
- SysBusDevice parent_obj;
+ CortexMPPrivState parent_obj;
uint32_t num_cpu;
MemoryRegion container;
@@ -59,7 +61,7 @@ struct A9MPPrivState {
OBJECT_DECLARE_SIMPLE_TYPE(A15MPPrivState, A15MPCORE_PRIV)
struct A15MPPrivState {
- SysBusDevice parent_obj;
+ CortexMPPrivState parent_obj;
uint32_t num_cpu;
uint32_t num_irq;
@@ -48,15 +48,23 @@ static void a15mp_priv_initfn(Object *obj)
static void a15mp_priv_realize(DeviceState *dev, Error **errp)
{
+ CortexMPPrivClass *cc = CORTEX_MPCORE_PRIV_GET_CLASS(dev);
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
A15MPPrivState *s = A15MPCORE_PRIV(dev);
DeviceState *gicdev;
SysBusDevice *gicsbd;
+ Error *local_err = NULL;
int i;
bool has_el3;
bool has_el2 = false;
Object *cpuobj;
+ cc->parent_realize(dev, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
gicdev = DEVICE(&s->gic);
qdev_prop_set_uint32(gicdev, "num-cpu", s->num_cpu);
qdev_prop_set_uint32(gicdev, "num-irq", s->num_irq);
@@ -158,8 +166,10 @@ static Property a15mp_priv_properties[] = {
static void a15mp_priv_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
+ CortexMPPrivClass *cc = CORTEX_MPCORE_PRIV_CLASS(klass);
- dc->realize = a15mp_priv_realize;
+ device_class_set_parent_realize(dc, a15mp_priv_realize,
+ &cc->parent_realize);
device_class_set_props(dc, a15mp_priv_properties);
/* We currently have no saveable state */
}
@@ -167,7 +177,7 @@ static void a15mp_priv_class_init(ObjectClass *klass, void *data)
static const TypeInfo a15mp_types[] = {
{
.name = TYPE_A15MPCORE_PRIV,
- .parent = TYPE_SYS_BUS_DEVICE,
+ .parent = TYPE_CORTEX_MPCORE_PRIV,
.instance_size = sizeof(A15MPPrivState),
.instance_init = a15mp_priv_initfn,
.class_init = a15mp_priv_class_init,
@@ -46,11 +46,13 @@ static void a9mp_priv_initfn(Object *obj)
static void a9mp_priv_realize(DeviceState *dev, Error **errp)
{
+ CortexMPPrivClass *cc = CORTEX_MPCORE_PRIV_GET_CLASS(dev);
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
A9MPPrivState *s = A9MPCORE_PRIV(dev);
DeviceState *scudev, *gicdev, *gtimerdev, *mptimerdev, *wdtdev;
SysBusDevice *scubusdev, *gicbusdev, *gtimerbusdev, *mptimerbusdev,
*wdtbusdev;
+ Error *local_err = NULL;
int i;
bool has_el3;
CPUState *cpu0;
@@ -65,6 +67,12 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
return;
}
+ cc->parent_realize(dev, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
scudev = DEVICE(&s->scu);
qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
@@ -173,15 +181,16 @@ static Property a9mp_priv_properties[] = {
static void a9mp_priv_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
+ CortexMPPrivClass *cc = CORTEX_MPCORE_PRIV_CLASS(klass);
- dc->realize = a9mp_priv_realize;
+ device_class_set_parent_realize(dc, a9mp_priv_realize, &cc->parent_realize);
device_class_set_props(dc, a9mp_priv_properties);
}
static const TypeInfo a9mp_types[] = {
{
.name = TYPE_A9MPCORE_PRIV,
- .parent = TYPE_SYS_BUS_DEVICE,
+ .parent = TYPE_CORTEX_MPCORE_PRIV,
.instance_size = sizeof(A9MPPrivState),
.instance_init = a9mp_priv_initfn,
.class_init = a9mp_priv_class_init,
@@ -648,6 +648,7 @@ config CORTEX_MPCORE
config A9MPCORE
bool
+ select CORTEX_MPCORE
select A9_GTIMER
select A9SCU # snoop control unit
select ARM_GIC
@@ -655,6 +656,7 @@ config A9MPCORE
config A15MPCORE
bool
+ select CORTEX_MPCORE
select ARM_GIC
config ARM11MPCORE
TYPE_CORTEX_MPCORE_PRIV becomes the common parent to TYPE_A9MPCORE_PRIV and TYPE_A15MPCORE_PRIV. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- include/hw/cpu/cortex_mpcore.h | 6 ++++-- hw/cpu/a15mpcore.c | 14 ++++++++++++-- hw/cpu/a9mpcore.c | 13 +++++++++++-- hw/arm/Kconfig | 2 ++ 4 files changed, 29 insertions(+), 6 deletions(-)