qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v6 03/10] ppc/xics: add a 'realize' handler to the x


From: Cédric Le Goater
Subject: [Qemu-devel] [PATCH v6 03/10] ppc/xics: add a 'realize' handler to the xics_common class
Date: Tue, 8 Nov 2016 09:08:03 +0100

The xics_spapr_realize() and xics_kvm_realize() routines both realize
the ICS and ICP objects the same way. We can move this part under the
parent class xics_common and keep only the specificities in the child
class.

Signed-off-by: Cédric Le Goater <address@hidden>
---

 To be noted : this patch changes a bit the call order. Realization of
 the ICS and ICP objects are now done before everything else.

 hw/intc/xics.c        | 36 ++++++++++++++++++++++++++++++++++++
 hw/intc/xics_kvm.c    | 26 ++------------------------
 hw/intc/xics_spapr.c  | 30 +-----------------------------
 include/hw/ppc/xics.h |  1 +
 4 files changed, 40 insertions(+), 53 deletions(-)

diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index cab8837245b3..dd77e3b77d69 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -253,6 +253,41 @@ static void xics_prop_set_nr_servers(Object *obj, Visitor 
*v,
     xsc->set_nr_servers(xics, value, errp);
 }
 
+static void xics_common_realize(DeviceState *dev, Error **errp)
+{
+    XICSState *xics = XICS_COMMON(dev);
+    XICSStateClass *xsc = XICS_COMMON_GET_CLASS(xics);
+    ICSState *ics;
+    Error *error = NULL;
+    int i;
+
+    if (!xics->nr_servers) {
+        error_setg(errp, "Number of servers needs to be greater 0");
+        return;
+    }
+
+    QLIST_FOREACH(ics, &xics->ics, list) {
+        object_property_set_bool(OBJECT(ics), true, "realized", &error);
+        if (error) {
+            error_propagate(errp, error);
+            return;
+        }
+    }
+
+    for (i = 0; i < xics->nr_servers; i++) {
+        object_property_set_bool(OBJECT(&xics->ss[i]), true, "realized",
+                                 &error);
+        if (error) {
+            error_propagate(errp, error);
+            return;
+        }
+    }
+
+    if (xsc->realize) {
+        xsc->realize(dev, errp);
+    }
+}
+
 static void xics_common_initfn(Object *obj)
 {
     XICSState *xics = XICS_COMMON(obj);
@@ -271,6 +306,7 @@ static void xics_common_class_init(ObjectClass *oc, void 
*data)
     DeviceClass *dc = DEVICE_CLASS(oc);
     InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(oc);
 
+    dc->realize = xics_common_realize;
     dc->reset = xics_common_reset;
     ic->print_info = xics_common_pic_print_info;
 }
diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
index 9b21281c4211..4fb631981f5c 100644
--- a/hw/intc/xics_kvm.c
+++ b/hw/intc/xics_kvm.c
@@ -388,10 +388,7 @@ static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState 
*spapr,
 static void xics_kvm_realize(DeviceState *dev, Error **errp)
 {
     KVMXICSState *xicskvm = XICS_SPAPR_KVM(dev);
-    XICSState *xics = XICS_COMMON(dev);
-    ICSState *ics;
-    int i, rc;
-    Error *error = NULL;
+    int rc;
     struct kvm_create_device xics_create_device = {
         .type = KVM_DEV_TYPE_XICS,
         .flags = 0,
@@ -441,24 +438,6 @@ static void xics_kvm_realize(DeviceState *dev, Error 
**errp)
 
     xicskvm->kernel_xics_fd = xics_create_device.fd;
 
-    QLIST_FOREACH(ics, &xics->ics, list) {
-        object_property_set_bool(OBJECT(ics), true, "realized", &error);
-        if (error) {
-            error_propagate(errp, error);
-            goto fail;
-        }
-    }
-
-    assert(xics->nr_servers);
-    for (i = 0; i < xics->nr_servers; i++) {
-        object_property_set_bool(OBJECT(&xics->ss[i]), true, "realized",
-                                 &error);
-        if (error) {
-            error_propagate(errp, error);
-            goto fail;
-        }
-    }
-
     kvm_kernel_irqchip = true;
     kvm_msi_via_irqfd_allowed = true;
     kvm_gsi_direct_mapping = true;
@@ -483,10 +462,9 @@ static void xics_kvm_initfn(Object *obj)
 
 static void xics_kvm_class_init(ObjectClass *oc, void *data)
 {
-    DeviceClass *dc = DEVICE_CLASS(oc);
     XICSStateClass *xsc = XICS_COMMON_CLASS(oc);
 
-    dc->realize = xics_kvm_realize;
+    xsc->realize = xics_kvm_realize;
     xsc->cpu_setup = xics_kvm_cpu_setup;
     xsc->set_nr_irqs = xics_kvm_set_nr_irqs;
     xsc->set_nr_servers = xics_kvm_set_nr_servers;
diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c
index 33afa9ecbf38..e15180f8304c 100644
--- a/hw/intc/xics_spapr.c
+++ b/hw/intc/xics_spapr.c
@@ -259,16 +259,6 @@ static void xics_spapr_set_nr_servers(XICSState *xics, 
uint32_t nr_servers,
 
 static void xics_spapr_realize(DeviceState *dev, Error **errp)
 {
-    XICSState *xics = XICS_SPAPR(dev);
-    ICSState *ics;
-    Error *error = NULL;
-    int i;
-
-    if (!xics->nr_servers) {
-        error_setg(errp, "Number of servers needs to be greater 0");
-        return;
-    }
-
     /* Registration of global state belongs into realize */
     spapr_rtas_register(RTAS_IBM_SET_XIVE, "ibm,set-xive", rtas_set_xive);
     spapr_rtas_register(RTAS_IBM_GET_XIVE, "ibm,get-xive", rtas_get_xive);
@@ -281,23 +271,6 @@ static void xics_spapr_realize(DeviceState *dev, Error 
**errp)
     spapr_register_hypercall(H_XIRR_X, h_xirr_x);
     spapr_register_hypercall(H_EOI, h_eoi);
     spapr_register_hypercall(H_IPOLL, h_ipoll);
-
-    QLIST_FOREACH(ics, &xics->ics, list) {
-        object_property_set_bool(OBJECT(ics), true, "realized", &error);
-        if (error) {
-            error_propagate(errp, error);
-            return;
-        }
-    }
-
-    for (i = 0; i < xics->nr_servers; i++) {
-        object_property_set_bool(OBJECT(&xics->ss[i]), true, "realized",
-                                 &error);
-        if (error) {
-            error_propagate(errp, error);
-            return;
-        }
-    }
 }
 
 static void xics_spapr_initfn(Object *obj)
@@ -311,10 +284,9 @@ static void xics_spapr_initfn(Object *obj)
 
 static void xics_spapr_class_init(ObjectClass *oc, void *data)
 {
-    DeviceClass *dc = DEVICE_CLASS(oc);
     XICSStateClass *xsc = XICS_SPAPR_CLASS(oc);
 
-    dc->realize = xics_spapr_realize;
+    xsc->realize = xics_spapr_realize;
     xsc->set_nr_irqs = xics_spapr_set_nr_irqs;
     xsc->set_nr_servers = xics_spapr_set_nr_servers;
 }
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index 1dbcdf02b43c..c58a09916f37 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -73,6 +73,7 @@ typedef struct ICSIRQState ICSIRQState;
 struct XICSStateClass {
     DeviceClass parent_class;
 
+    void (*realize)(DeviceState *dev, Error **errp);
     void (*cpu_setup)(XICSState *icp, PowerPCCPU *cpu);
     void (*set_nr_irqs)(XICSState *icp, uint32_t nr_irqs, Error **errp);
     void (*set_nr_servers)(XICSState *icp, uint32_t nr_servers, Error **errp);
-- 
2.7.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]