On Mon, Sep 11, 2017 at 07:12:20PM +0200, Cédric Le Goater wrote: > These are very similar to the XICS handlers in a simpler form. They > make use of the ICSIRQState array of the XICS interrupt source to > differentiate the MSI from the LSI interrupts. The spapr_xive_irq() > routine in charge of triggering the CPU interrupt line will be filled > later on. > > The next patch will introduce the MMIO handlers to interact with XIVE > interrupt sources. > > Signed-off-by: Cédric Le Goater <c...@kaod.org> > --- > hw/intc/spapr_xive.c | 46 > +++++++++++++++++++++++++++++++++++++++++++++ > include/hw/ppc/spapr_xive.h | 1 + > 2 files changed, 47 insertions(+) > > diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c > index 52c32f588d6d..1ed7b6a286e9 100644 > --- a/hw/intc/spapr_xive.c > +++ b/hw/intc/spapr_xive.c > @@ -27,6 +27,50 @@ > > #include "xive-internal.h" > > +static void spapr_xive_irq(sPAPRXive *xive, int srcno) > +{ > + > +} > + > +/* > + * XIVE Interrupt Source > + */ > +static void spapr_xive_source_set_irq_msi(sPAPRXive *xive, int srcno, int > val) > +{ > + if (val) { > + spapr_xive_irq(xive, srcno); > + } > +}
So in XICS "srcno" (vs "irq") indicates an offset within a single ICS object, as opposed to a global irq number. Does that concept even exist in XIVE? > + > +static void spapr_xive_source_set_irq_lsi(sPAPRXive *xive, int srcno, int > val) > +{ > + ICSIRQState *irq = &xive->ics->irqs[srcno]; > + > + if (val) { > + irq->status |= XICS_STATUS_ASSERTED; > + } else { > + irq->status &= ~XICS_STATUS_ASSERTED; More mangling a XICS specific object for XIVE operations. Please stop. > + } > + > + if (irq->status & XICS_STATUS_ASSERTED > + && !(irq->status & XICS_STATUS_SENT)) { > + irq->status |= XICS_STATUS_SENT; > + spapr_xive_irq(xive, srcno); > + } > +} > + > +static void spapr_xive_source_set_irq(void *opaque, int srcno, int val) > +{ > + sPAPRXive *xive = SPAPR_XIVE(opaque); > + ICSIRQState *irq = &xive->ics->irqs[srcno]; > + > + if (irq->flags & XICS_FLAGS_IRQ_LSI) { > + spapr_xive_source_set_irq_lsi(xive, srcno, val); > + } else { > + spapr_xive_source_set_irq_msi(xive, srcno, val); > + } > +} > + > /* > * Main XIVE object > */ > @@ -80,6 +124,8 @@ static void spapr_xive_realize(DeviceState *dev, Error > **errp) > } > > xive->ics = ICS_BASE(obj); > + xive->qirqs = qemu_allocate_irqs(spapr_xive_source_set_irq, xive, > + xive->nr_irqs); > > /* Allocate the last IRQ numbers for the IPIs */ > for (i = xive->nr_irqs - xive->nr_targets; i < xive->nr_irqs; i++) { > diff --git a/include/hw/ppc/spapr_xive.h b/include/hw/ppc/spapr_xive.h > index 29112589b37f..eab92c4c1bb8 100644 > --- a/include/hw/ppc/spapr_xive.h > +++ b/include/hw/ppc/spapr_xive.h > @@ -38,6 +38,7 @@ struct sPAPRXive { > > /* IRQ */ > ICSState *ics; /* XICS source inherited from the SPAPR machine */ > + qemu_irq *qirqs; > > /* XIVE internal tables */ > uint8_t *sbe; -- 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