Message ID | 20181205232251.10446-4-clg@kaod.org |
---|---|
State | New |
Headers | show |
Series | ppc: support for the XIVE interrupt controller (POWER9) | expand |
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 <clg@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)
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 <clg@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) >
On Thu, Dec 06, 2018 at 07:17:47AM +0100, Cédric Le Goater wrote: > 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 <clg@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. So, I've now applied patches 1-5. I think we've agreed to a change in patch 6 which will require tweaks to a bunch further down the series, so I think the rest will need a v7.
On 12/7/18 3:07 AM, David Gibson wrote: > On Thu, Dec 06, 2018 at 07:17:47AM +0100, Cédric Le Goater wrote: >> 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 <clg@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. > > So, I've now applied patches 1-5. I think we've agreed to a change in > patch 6 which will require tweaks to a bunch further down the series, yes. > so I think the rest will need a v7. Yes. Here's my TODO list : - some asserts and comments - introduce a helper to get the CAM line of a ring - rework the physical CAM line setting. - introduce a "block" property in XiveENDSource - remove chip_id id from XiveRouter - may be modify XiveRouter to be a QOM interface The hcalls are the big remaining part to review before adding the XIVE-only machine. I think I will move up in the patchset the TCG "dual" machine because it does not need much more changes and the XICS machine is not impacted. KVM will come after. Thanks, C.
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" +#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)
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 <clg@kaod.org> --- include/hw/ppc/xive.h | 23 +++++++++++++++++++++++ hw/intc/xive.c | 25 +++++++++++++++++++++++++ 2 files changed, 48 insertions(+)