On Thu, Dec 06, 2018 at 12:22:17AM +0100, Cédric Le Goater wrote: > The XiveNotifier offers a simple interface, between the XiveSource > object and the main interrupt controller of the machine. It will > forward event notifications to the XIVE Interrupt Virtualization > Routing Engine (IVRE). > > Signed-off-by: Cédric Le Goater <c...@kaod.org> > --- > include/hw/ppc/xive.h | 23 +++++++++++++++++++++++ > hw/intc/xive.c | 25 +++++++++++++++++++++++++ > 2 files changed, 48 insertions(+) > > diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h > index 7cebc32eba4c..6770cffec67d 100644 > --- a/include/hw/ppc/xive.h > +++ b/include/hw/ppc/xive.h > @@ -142,6 +142,27 @@ > > #include "hw/qdev-core.h" > > +/* > + * XIVE Fabric (Interface between Source and Router) > + */ > + > +typedef struct XiveNotifier { > + Object parent; > +} XiveNotifier; > + > +#define TYPE_XIVE_NOTIFIER "xive-fabric"
I'm applying this, but changing the string here from "xive-fabric" to "xive-notifier". > +#define XIVE_NOTIFIER(obj) \ > + OBJECT_CHECK(XiveNotifier, (obj), TYPE_XIVE_NOTIFIER) > +#define XIVE_NOTIFIER_CLASS(klass) \ > + OBJECT_CLASS_CHECK(XiveNotifierClass, (klass), TYPE_XIVE_NOTIFIER) > +#define XIVE_NOTIFIER_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(XiveNotifierClass, (obj), TYPE_XIVE_NOTIFIER) > + > +typedef struct XiveNotifierClass { > + InterfaceClass parent; > + void (*notify)(XiveNotifier *xn, uint32_t lisn); > +} XiveNotifierClass; > + > /* > * XIVE Interrupt Source > */ > @@ -171,6 +192,8 @@ typedef struct XiveSource { > uint64_t esb_flags; > uint32_t esb_shift; > MemoryRegion esb_mmio; > + > + XiveNotifier *xive; > } XiveSource; > > /* > diff --git a/hw/intc/xive.c b/hw/intc/xive.c > index 11c7aac962de..79238eb57fae 100644 > --- a/hw/intc/xive.c > +++ b/hw/intc/xive.c > @@ -155,7 +155,11 @@ static bool xive_source_esb_eoi(XiveSource *xsrc, > uint32_t srcno) > */ > static void xive_source_notify(XiveSource *xsrc, int srcno) > { > + XiveNotifierClass *xnc = XIVE_NOTIFIER_GET_CLASS(xsrc->xive); > > + if (xnc->notify) { > + xnc->notify(xsrc->xive, srcno); > + } > } > > /* > @@ -362,6 +366,17 @@ static void xive_source_reset(void *dev) > static void xive_source_realize(DeviceState *dev, Error **errp) > { > XiveSource *xsrc = XIVE_SOURCE(dev); > + Object *obj; > + Error *local_err = NULL; > + > + obj = object_property_get_link(OBJECT(dev), "xive", &local_err); > + if (!obj) { > + error_propagate(errp, local_err); > + error_prepend(errp, "required link 'xive' not found: "); > + return; > + } > + > + xsrc->xive = XIVE_NOTIFIER(obj); > > if (!xsrc->nr_irqs) { > error_setg(errp, "Number of interrupt needs to be greater than 0"); > @@ -428,9 +443,19 @@ static const TypeInfo xive_source_info = { > .class_init = xive_source_class_init, > }; > > +/* > + * XIVE Fabric > + */ > +static const TypeInfo xive_fabric_info = { > + .name = TYPE_XIVE_NOTIFIER, > + .parent = TYPE_INTERFACE, > + .class_size = sizeof(XiveNotifierClass), > +}; > + > static void xive_register_types(void) > { > type_register_static(&xive_source_info); > + type_register_static(&xive_fabric_info); > } > > type_init(xive_register_types) -- 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
signature.asc
Description: PGP signature