summary refs log tree commit diff stats
path: root/hw/intc/xics.c
diff options
context:
space:
mode:
authorCédric Le Goater <clg@kaod.org>2018-06-25 11:17:14 +0200
committerDavid Gibson <david@gibson.dropbear.id.au>2018-07-03 09:56:51 +1000
commit0a647b76dbf29e6a20c328cd8676a1ca49526f09 (patch)
treeca5a3b68cbb26a4adfa33f78817c1476691bd0d2 /hw/intc/xics.c
parenta028dd423ee6dfd091a8c63028240832bf10f671 (diff)
downloadfocaccia-qemu-0a647b76dbf29e6a20c328cd8676a1ca49526f09.tar.gz
focaccia-qemu-0a647b76dbf29e6a20c328cd8676a1ca49526f09.zip
ppc/xics: introduce a parent_realize in ICSStateClass
This makes possible to move the common ICSState code of the realize
handlers in the ics-base class.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'hw/intc/xics.c')
-rw-r--r--hw/intc/xics.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index 063491f387..d6066d561f 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -618,30 +618,31 @@ static void ics_simple_initfn(Object *obj)
     ics->offset = XICS_IRQ_BASE;
 }
 
-static void ics_simple_realize(ICSState *ics, Error **errp)
+static void ics_simple_realize(DeviceState *dev, Error **errp)
 {
-    if (!ics->nr_irqs) {
-        error_setg(errp, "Number of interrupts needs to be greater 0");
+    ICSState *ics = ICS_SIMPLE(dev);
+    ICSStateClass *icsc = ICS_BASE_GET_CLASS(ics);
+    Error *local_err = NULL;
+
+    icsc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
         return;
     }
-    ics->irqs = g_malloc0(ics->nr_irqs * sizeof(ICSIRQState));
+
     ics->qirqs = qemu_allocate_irqs(ics_simple_set_irq, ics, ics->nr_irqs);
 
     qemu_register_reset(ics_simple_reset, ics);
 }
 
-static Property ics_simple_properties[] = {
-    DEFINE_PROP_UINT32("nr-irqs", ICSState, nr_irqs, 0),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
 static void ics_simple_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
     ICSStateClass *isc = ICS_BASE_CLASS(klass);
 
-    isc->realize = ics_simple_realize;
-    dc->props = ics_simple_properties;
+    device_class_set_parent_realize(dc, ics_simple_realize,
+                                    &isc->parent_realize);
+
     dc->vmsd = &vmstate_ics_simple;
     isc->reject = ics_simple_reject;
     isc->resend = ics_simple_resend;
@@ -659,7 +660,6 @@ static const TypeInfo ics_simple_info = {
 
 static void ics_base_realize(DeviceState *dev, Error **errp)
 {
-    ICSStateClass *icsc = ICS_BASE_GET_CLASS(dev);
     ICSState *ics = ICS_BASE(dev);
     Object *obj;
     Error *err = NULL;
@@ -672,17 +672,24 @@ static void ics_base_realize(DeviceState *dev, Error **errp)
     }
     ics->xics = XICS_FABRIC(obj);
 
-
-    if (icsc->realize) {
-        icsc->realize(ics, errp);
+    if (!ics->nr_irqs) {
+        error_setg(errp, "Number of interrupts needs to be greater 0");
+        return;
     }
+    ics->irqs = g_malloc0(ics->nr_irqs * sizeof(ICSIRQState));
 }
 
+static Property ics_base_properties[] = {
+    DEFINE_PROP_UINT32("nr-irqs", ICSState, nr_irqs, 0),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static void ics_base_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = ics_base_realize;
+    dc->props = ics_base_properties;
 }
 
 static const TypeInfo ics_base_info = {