On Fri, 15 Nov 2019 17:24:21 +0100 Cédric Le Goater <c...@kaod.org> wrote:
> When the XIVE IVRE sub-engine (XiveRouter) looks for a Notification > Virtual Target (NVT) to notify, it broadcasts a message on the > PowerBUS to find an XIVE IVPE sub-engine (Presenter) with the NVT > dispatched on one of its HW threads, and then forwards the > notification if any response was received. > > The current XIVE presenter model is sufficient for the pseries machine > because it has a single interrupt controller device, but the PowerNV > machine can have multiple chips each having its own interrupt > controller. In this case, the XIVE presenter model is too simple and > the CAM line matching should scan all chips of the system. > > To start fixing this issue, we first extend the XIVE Router model with > a new XivePresenter QOM interface representing the XIVE IVPE > sub-engine. This interface exposes a 'match_nvt' handler which the > sPAPR and PowerNV XIVE Router models will need to implement to perform > the CAM line matching. > > Signed-off-by: Cédric Le Goater <c...@kaod.org> > --- > include/hw/ppc/xive.h | 32 ++++++++++++++++++++++++++++++++ > hw/intc/xive.c | 26 +++++++++++++++++--------- > 2 files changed, 49 insertions(+), 9 deletions(-) > > diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h > index fa7adf87feb2..f9aa0fa0dac3 100644 > --- a/include/hw/ppc/xive.h > +++ b/include/hw/ppc/xive.h > @@ -367,6 +367,38 @@ int xive_router_write_nvt(XiveRouter *xrtr, uint8_t > nvt_blk, uint32_t nvt_idx, > XiveTCTX *xive_router_get_tctx(XiveRouter *xrtr, CPUState *cs); > void xive_router_notify(XiveNotifier *xn, uint32_t lisn); > > +/* > + * XIVE Presenter > + */ > + > +typedef struct XiveTCTXMatch { > + XiveTCTX *tctx; > + uint8_t ring; > +} XiveTCTXMatch; > + We recently decided to follow a strict CamelCase naming scheme in spapr. We should probably do the same in other areas. Can you please make this XiveTctxMatch ? I can send follow-up patches to convert the existing code later on, ie. after this series is merged at last :) The patch looks good anyway so: Reviewed-by: Greg Kurz <gr...@kaod.org> > +typedef struct XivePresenter XivePresenter; > + > +#define TYPE_XIVE_PRESENTER "xive-presenter" > +#define XIVE_PRESENTER(obj) \ > + INTERFACE_CHECK(XivePresenter, (obj), TYPE_XIVE_PRESENTER) > +#define XIVE_PRESENTER_CLASS(klass) \ > + OBJECT_CLASS_CHECK(XivePresenterClass, (klass), TYPE_XIVE_PRESENTER) > +#define XIVE_PRESENTER_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(XivePresenterClass, (obj), TYPE_XIVE_PRESENTER) > + > +typedef struct XivePresenterClass { > + InterfaceClass parent; > + int (*match_nvt)(XivePresenter *xptr, uint8_t format, > + uint8_t nvt_blk, uint32_t nvt_idx, > + bool cam_ignore, uint8_t priority, > + uint32_t logic_serv, XiveTCTXMatch *match); > +} XivePresenterClass; > + > +int xive_presenter_tctx_match(XivePresenter *xptr, XiveTCTX *tctx, > + uint8_t format, > + uint8_t nvt_blk, uint32_t nvt_idx, > + bool cam_ignore, uint32_t logic_serv); > + > /* > * XIVE END ESBs > */ > diff --git a/hw/intc/xive.c b/hw/intc/xive.c > index 511e1a936347..344bb3f3bc4b 100644 > --- a/hw/intc/xive.c > +++ b/hw/intc/xive.c > @@ -1363,9 +1363,10 @@ static uint32_t xive_tctx_hw_cam_line(XiveTCTX *tctx) > /* > * The thread context register words are in big-endian format. > */ > -static int xive_presenter_tctx_match(XiveTCTX *tctx, uint8_t format, > - uint8_t nvt_blk, uint32_t nvt_idx, > - bool cam_ignore, uint32_t logic_serv) > +int xive_presenter_tctx_match(XivePresenter *xptr, XiveTCTX *tctx, > + uint8_t format, > + uint8_t nvt_blk, uint32_t nvt_idx, > + bool cam_ignore, uint32_t logic_serv) > { > uint32_t cam = xive_nvt_cam_line(nvt_blk, nvt_idx); > uint32_t qw3w2 = xive_tctx_word2(&tctx->regs[TM_QW3_HV_PHYS]); > @@ -1422,11 +1423,6 @@ static int xive_presenter_tctx_match(XiveTCTX *tctx, > uint8_t format, > return -1; > } > > -typedef struct XiveTCTXMatch { > - XiveTCTX *tctx; > - uint8_t ring; > -} XiveTCTXMatch; > - > static bool xive_presenter_match(XiveRouter *xrtr, uint8_t format, > uint8_t nvt_blk, uint32_t nvt_idx, > bool cam_ignore, uint8_t priority, > @@ -1460,7 +1456,8 @@ static bool xive_presenter_match(XiveRouter *xrtr, > uint8_t format, > * Check the thread context CAM lines and record matches. We > * will handle CPU exception delivery later > */ > - ring = xive_presenter_tctx_match(tctx, format, nvt_blk, nvt_idx, > + ring = xive_presenter_tctx_match(XIVE_PRESENTER(xrtr), tctx, format, > + nvt_blk, nvt_idx, > cam_ignore, logic_serv); > /* > * Save the context and follow on to catch duplicates, that we > @@ -1754,6 +1751,7 @@ static const TypeInfo xive_router_info = { > .class_init = xive_router_class_init, > .interfaces = (InterfaceInfo[]) { > { TYPE_XIVE_NOTIFIER }, > + { TYPE_XIVE_PRESENTER }, > { } > } > }; > @@ -1923,10 +1921,20 @@ static const TypeInfo xive_notifier_info = { > .class_size = sizeof(XiveNotifierClass), > }; > > +/* > + * XIVE Presenter > + */ > +static const TypeInfo xive_presenter_info = { > + .name = TYPE_XIVE_PRESENTER, > + .parent = TYPE_INTERFACE, > + .class_size = sizeof(XivePresenterClass), > +}; > + > static void xive_register_types(void) > { > type_register_static(&xive_source_info); > type_register_static(&xive_notifier_info); > + type_register_static(&xive_presenter_info); > type_register_static(&xive_router_info); > type_register_static(&xive_end_source_info); > type_register_static(&xive_tctx_info);