@@ -84,9 +84,8 @@ static void spapr_xive_init(Object *obj)
object_property_add_child(obj, "source", OBJECT(&xive->source), NULL);
}
-static void spapr_xive_realize(DeviceState *dev, Error **errp)
+void spapr_xive_common_realize(sPAPRXive *xive, int esb_shift, Error **errp)
{
- sPAPRXive *xive = SPAPR_XIVE(dev);
XiveSource *xsrc = &xive->source;
Error *local_err = NULL;
@@ -105,6 +104,8 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
&error_fatal);
object_property_set_int(OBJECT(xsrc), xive->nr_irqs, "nr-irqs",
&error_fatal);
+ object_property_set_int(OBJECT(xsrc), esb_shift, "shift",
+ &error_fatal);
object_property_add_const_link(OBJECT(xsrc), "xive", OBJECT(xive),
&error_fatal);
object_property_set_bool(OBJECT(xsrc), true, "realized", &local_err);
@@ -122,6 +123,18 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
* level views of the TIMA.
*/
xive->tm_base = XIVE_TM_BASE;
+}
+
+static void spapr_xive_realize(DeviceState *dev, Error **errp)
+{
+ sPAPRXive *xive = SPAPR_XIVE(dev);
+ Error *local_err = NULL;
+
+ spapr_xive_common_realize(xive, XIVE_ESB_64K_2PAGE, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
memory_region_init_io(&xive->tm_mmio_user, OBJECT(xive),
&xive_tm_user_ops, xive, "xive.tima.user",
@@ -903,13 +903,13 @@ static void xive_source_reset(DeviceState *dev)
}
}
-static void xive_source_realize(DeviceState *dev, Error **errp)
+void xive_source_common_realize(XiveSource *xsrc, qemu_irq_handler handler,
+ Error **errp)
{
- XiveSource *xsrc = XIVE_SOURCE(dev);
Object *obj;
Error *local_err = NULL;
- obj = object_property_get_link(OBJECT(dev), "xive", &local_err);
+ obj = object_property_get_link(OBJECT(xsrc), "xive", &local_err);
if (!obj) {
error_propagate(errp, local_err);
error_prepend(errp, "required link 'xive' not found: ");
@@ -931,13 +931,24 @@ static void xive_source_realize(DeviceState *dev, Error **errp)
return;
}
- xsrc->qirqs = qemu_allocate_irqs(xive_source_set_irq, xsrc,
- xsrc->nr_irqs);
+ xsrc->qirqs = qemu_allocate_irqs(handler, xsrc, xsrc->nr_irqs);
xsrc->status = g_malloc0(xsrc->nr_irqs);
/* Allocate the SBEs (State Bit Entry). 2 bits, so 4 entries per byte */
xsrc->sbe_size = DIV_ROUND_UP(xsrc->nr_irqs, 4);
xsrc->sbe = g_malloc0(xsrc->sbe_size);
+}
+
+static void xive_source_realize(DeviceState *dev, Error **errp)
+{
+ XiveSource *xsrc = XIVE_SOURCE(dev);
+ Error *local_err = NULL;
+
+ xive_source_common_realize(xsrc, xive_source_set_irq, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
/* TODO: H_INT_ESB support, which removing the ESB MMIOs */
@@ -51,6 +51,7 @@ void spapr_xive_pic_print_info(sPAPRXive *xive, Monitor *mon);
void spapr_xive_mmio_map(sPAPRXive *xive);
void spapr_xive_mmio_unmap(sPAPRXive *xive);
qemu_irq spapr_xive_qirq(sPAPRXive *xive, int lisn);
+void spapr_xive_common_realize(sPAPRXive *xive, int esb_shift, Error **errp);
/*
* sPAPR encoding of EQ indexes
@@ -175,6 +175,9 @@ static inline qemu_irq xive_source_qirq(XiveSource *xsrc, uint32_t srcno)
return xsrc->qirqs[srcno];
}
+void xive_source_common_realize(XiveSource *xsrc, qemu_irq_handler handler,
+ Error **errp);
+
/*
* XIVE Interrupt Presenter
*/
The XiveSource and sPAPRXive device models will be shared between the emulated and the KVM mode. The difference will reside in the way the memory regions are initialized and in the qemu_irq handler. Introduce common realize routines to share some code. Signed-off-by: Cédric Le Goater <clg@kaod.org> --- hw/intc/spapr_xive.c | 17 +++++++++++++++-- hw/intc/xive.c | 21 ++++++++++++++++----- include/hw/ppc/spapr_xive.h | 1 + include/hw/ppc/xive.h | 3 +++ 4 files changed, 35 insertions(+), 7 deletions(-)