On 12/6/18 4:25 AM, David Gibson wrote: > 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".
Ah yes. My sed command missed that. Thanks, C. > > >> +#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) >