[PATCH v2 06/13] pnv/xive: Use device_class_set_parent_realize()

Cédric Le Goater posted 13 patches 6 years, 1 month ago
Maintainers: David Gibson <david@gibson.dropbear.id.au>, "Cédric Le Goater" <clg@kaod.org>
[PATCH v2 06/13] pnv/xive: Use device_class_set_parent_realize()
Posted by Cédric Le Goater 6 years, 1 month ago
From: Greg Kurz <groug@kaod.org>

The XIVE router base class currently inherits an empty realize hook
from the sysbus device base class, but it will soon implement one
of its own to perform some sanity checks. Do the preliminary plumbing
to have it called.

Signed-off-by: Greg Kurz <groug@kaod.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 include/hw/ppc/pnv_xive.h | 10 ++++++++++
 hw/intc/pnv_xive.c        | 10 ++++++++++
 2 files changed, 20 insertions(+)

diff --git a/include/hw/ppc/pnv_xive.h b/include/hw/ppc/pnv_xive.h
index 4d641db691c8..ba9bbeab88c3 100644
--- a/include/hw/ppc/pnv_xive.h
+++ b/include/hw/ppc/pnv_xive.h
@@ -16,6 +16,10 @@ struct PnvChip;
 
 #define TYPE_PNV_XIVE "pnv-xive"
 #define PNV_XIVE(obj) OBJECT_CHECK(PnvXive, (obj), TYPE_PNV_XIVE)
+#define PNV_XIVE_CLASS(klass)                                   \
+    OBJECT_CLASS_CHECK(PnvXiveClass, (klass), TYPE_PNV_XIVE)
+#define PNV_XIVE_GET_CLASS(obj)                                 \
+    OBJECT_GET_CLASS(PnvXiveClass, (obj), TYPE_PNV_XIVE)
 
 #define XIVE_BLOCK_MAX      16
 
@@ -87,6 +91,12 @@ typedef struct PnvXive {
     uint64_t      edt[XIVE_TABLE_EDT_MAX];
 } PnvXive;
 
+typedef struct PnvXiveClass {
+    XiveRouterClass parent_class;
+
+    DeviceRealize parent_realize;
+} PnvXiveClass;
+
 void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon);
 
 #endif /* PPC_PNV_XIVE_H */
diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
index 66970a60733b..1962f884d6de 100644
--- a/hw/intc/pnv_xive.c
+++ b/hw/intc/pnv_xive.c
@@ -1816,10 +1816,17 @@ static void pnv_xive_init(Object *obj)
 static void pnv_xive_realize(DeviceState *dev, Error **errp)
 {
     PnvXive *xive = PNV_XIVE(dev);
+    PnvXiveClass *pxc = PNV_XIVE_GET_CLASS(dev);
     XiveSource *xsrc = &xive->ipi_source;
     XiveENDSource *end_xsrc = &xive->end_source;
     Error *local_err = NULL;
 
+    pxc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
     assert(xive->chip);
     assert(xive->system_memory);
 
@@ -1950,10 +1957,12 @@ static void pnv_xive_class_init(ObjectClass *klass, void *data)
     XiveRouterClass *xrc = XIVE_ROUTER_CLASS(klass);
     XiveNotifierClass *xnc = XIVE_NOTIFIER_CLASS(klass);
     XivePresenterClass *xpc = XIVE_PRESENTER_CLASS(klass);
+    PnvXiveClass *pxc = PNV_XIVE_CLASS(klass);
 
     xdc->dt_xscom = pnv_xive_dt_xscom;
 
     dc->desc = "PowerNV XIVE Interrupt Controller";
+    device_class_set_parent_realize(dc, pnv_xive_realize, &pxc->parent_realize);
     dc->realize = pnv_xive_realize;
     dc->props = pnv_xive_properties;
 
@@ -1974,6 +1983,7 @@ static const TypeInfo pnv_xive_info = {
     .instance_init = pnv_xive_init,
     .instance_size = sizeof(PnvXive),
     .class_init    = pnv_xive_class_init,
+    .class_size    = sizeof(PnvXiveClass),
     .interfaces    = (InterfaceInfo[]) {
         { TYPE_PNV_XSCOM_INTERFACE },
         { }
-- 
2.21.0


Re: [PATCH v2 06/13] pnv/xive: Use device_class_set_parent_realize()
Posted by David Gibson 6 years, 1 month ago
On Thu, Dec 19, 2019 at 07:11:48PM +0100, Cédric Le Goater wrote:
> From: Greg Kurz <groug@kaod.org>
> 
> The XIVE router base class currently inherits an empty realize hook
> from the sysbus device base class, but it will soon implement one
> of its own to perform some sanity checks. Do the preliminary plumbing
> to have it called.
> 
> Signed-off-by: Greg Kurz <groug@kaod.org>
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

But will need a rebase due to changes earlier in the series.

> ---
>  include/hw/ppc/pnv_xive.h | 10 ++++++++++
>  hw/intc/pnv_xive.c        | 10 ++++++++++
>  2 files changed, 20 insertions(+)
> 
> diff --git a/include/hw/ppc/pnv_xive.h b/include/hw/ppc/pnv_xive.h
> index 4d641db691c8..ba9bbeab88c3 100644
> --- a/include/hw/ppc/pnv_xive.h
> +++ b/include/hw/ppc/pnv_xive.h
> @@ -16,6 +16,10 @@ struct PnvChip;
>  
>  #define TYPE_PNV_XIVE "pnv-xive"
>  #define PNV_XIVE(obj) OBJECT_CHECK(PnvXive, (obj), TYPE_PNV_XIVE)
> +#define PNV_XIVE_CLASS(klass)                                   \
> +    OBJECT_CLASS_CHECK(PnvXiveClass, (klass), TYPE_PNV_XIVE)
> +#define PNV_XIVE_GET_CLASS(obj)                                 \
> +    OBJECT_GET_CLASS(PnvXiveClass, (obj), TYPE_PNV_XIVE)
>  
>  #define XIVE_BLOCK_MAX      16
>  
> @@ -87,6 +91,12 @@ typedef struct PnvXive {
>      uint64_t      edt[XIVE_TABLE_EDT_MAX];
>  } PnvXive;
>  
> +typedef struct PnvXiveClass {
> +    XiveRouterClass parent_class;
> +
> +    DeviceRealize parent_realize;
> +} PnvXiveClass;
> +
>  void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon);
>  
>  #endif /* PPC_PNV_XIVE_H */
> diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
> index 66970a60733b..1962f884d6de 100644
> --- a/hw/intc/pnv_xive.c
> +++ b/hw/intc/pnv_xive.c
> @@ -1816,10 +1816,17 @@ static void pnv_xive_init(Object *obj)
>  static void pnv_xive_realize(DeviceState *dev, Error **errp)
>  {
>      PnvXive *xive = PNV_XIVE(dev);
> +    PnvXiveClass *pxc = PNV_XIVE_GET_CLASS(dev);
>      XiveSource *xsrc = &xive->ipi_source;
>      XiveENDSource *end_xsrc = &xive->end_source;
>      Error *local_err = NULL;
>  
> +    pxc->parent_realize(dev, &local_err);
> +    if (local_err) {
> +        error_propagate(errp, local_err);
> +        return;
> +    }
> +
>      assert(xive->chip);
>      assert(xive->system_memory);
>  
> @@ -1950,10 +1957,12 @@ static void pnv_xive_class_init(ObjectClass *klass, void *data)
>      XiveRouterClass *xrc = XIVE_ROUTER_CLASS(klass);
>      XiveNotifierClass *xnc = XIVE_NOTIFIER_CLASS(klass);
>      XivePresenterClass *xpc = XIVE_PRESENTER_CLASS(klass);
> +    PnvXiveClass *pxc = PNV_XIVE_CLASS(klass);
>  
>      xdc->dt_xscom = pnv_xive_dt_xscom;
>  
>      dc->desc = "PowerNV XIVE Interrupt Controller";
> +    device_class_set_parent_realize(dc, pnv_xive_realize, &pxc->parent_realize);
>      dc->realize = pnv_xive_realize;
>      dc->props = pnv_xive_properties;
>  
> @@ -1974,6 +1983,7 @@ static const TypeInfo pnv_xive_info = {
>      .instance_init = pnv_xive_init,
>      .instance_size = sizeof(PnvXive),
>      .class_init    = pnv_xive_class_init,
> +    .class_size    = sizeof(PnvXiveClass),
>      .interfaces    = (InterfaceInfo[]) {
>          { TYPE_PNV_XSCOM_INTERFACE },
>          { }

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson