Message ID | 20180911055503.2303-3-clg@kaod.org |
---|---|
State | New |
Headers | show |
Series | spapr: introduce a new sPAPRIrq backend | expand |
On Tue, 11 Sep 2018 07:55:03 +0200 Cédric Le Goater <clg@kaod.org> wrote: > The new layout using static IRQ number does not leave much space to > the dynamic MSI range, only 0x100 IRQ numbers. Increase the total > number of IRQS for newer machines and introduce a legacy XICS backend > for pre-3.1 machines to maintain compatibility. > > For the old backend, provide a 'nr_msis' value covering the full IRQ > number space as it does not use the bitmap allocator to allocate MSI > interrupt numbers. > > Signed-off-by: Cédric Le Goater <clg@kaod.org> > --- Reviewed-by: Greg Kurz <groug@kaod.org> > include/hw/ppc/spapr_irq.h | 1 + > hw/ppc/spapr.c | 1 + > hw/ppc/spapr_irq.c | 15 ++++++++++++++- > 3 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/include/hw/ppc/spapr_irq.h b/include/hw/ppc/spapr_irq.h > index 650f810ad2aa..a467ce696ee4 100644 > --- a/include/hw/ppc/spapr_irq.h > +++ b/include/hw/ppc/spapr_irq.h > @@ -41,6 +41,7 @@ typedef struct sPAPRIrq { > } sPAPRIrq; > > extern sPAPRIrq spapr_irq_xics; > +extern sPAPRIrq spapr_irq_xics_legacy; > > int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp); > void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num); > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 4a9dd4d9bc14..eba7d60a30a7 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -3971,6 +3971,7 @@ static void spapr_machine_3_0_class_options(MachineClass *mc) > SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_3_0); > > smc->legacy_irq_allocation = true; > + smc->irq = &spapr_irq_xics_legacy; > } > > DEFINE_SPAPR_MACHINE(3_0, "3.0", false); > diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c > index fe8be5f5217a..e77b94cc685e 100644 > --- a/hw/ppc/spapr_irq.c > +++ b/hw/ppc/spapr_irq.c > @@ -195,7 +195,7 @@ static void spapr_irq_print_info_xics(sPAPRMachineState *spapr, Monitor *mon) > ics_pic_print_info(spapr->ics, mon); > } > > -#define SPAPR_IRQ_XICS_NR_IRQS 0x400 > +#define SPAPR_IRQ_XICS_NR_IRQS 0x1000 > #define SPAPR_IRQ_XICS_NR_MSIS \ > (XICS_IRQ_BASE + SPAPR_IRQ_XICS_NR_IRQS - SPAPR_IRQ_MSI) > > @@ -289,3 +289,16 @@ int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp) > > return first + ics->offset; > } > + > +#define SPAPR_IRQ_XICS_LEGACY_NR_IRQS 0x400 > + > +sPAPRIrq spapr_irq_xics_legacy = { > + .nr_irqs = SPAPR_IRQ_XICS_LEGACY_NR_IRQS, > + .nr_msis = SPAPR_IRQ_XICS_LEGACY_NR_IRQS, > + > + .init = spapr_irq_init_xics, > + .claim = spapr_irq_claim_xics, > + .free = spapr_irq_free_xics, > + .qirq = spapr_qirq_xics, > + .print_info = spapr_irq_print_info_xics, > +};
On Tue, Sep 11, 2018 at 07:55:03AM +0200, Cédric Le Goater wrote: > The new layout using static IRQ number does not leave much space to > the dynamic MSI range, only 0x100 IRQ numbers. Increase the total > number of IRQS for newer machines and introduce a legacy XICS backend > for pre-3.1 machines to maintain compatibility. > > For the old backend, provide a 'nr_msis' value covering the full IRQ > number space as it does not use the bitmap allocator to allocate MSI > interrupt numbers. > > Signed-off-by: Cédric Le Goater <clg@kaod.org> Applied to ppc-for-3.1, thanks. > --- > include/hw/ppc/spapr_irq.h | 1 + > hw/ppc/spapr.c | 1 + > hw/ppc/spapr_irq.c | 15 ++++++++++++++- > 3 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/include/hw/ppc/spapr_irq.h b/include/hw/ppc/spapr_irq.h > index 650f810ad2aa..a467ce696ee4 100644 > --- a/include/hw/ppc/spapr_irq.h > +++ b/include/hw/ppc/spapr_irq.h > @@ -41,6 +41,7 @@ typedef struct sPAPRIrq { > } sPAPRIrq; > > extern sPAPRIrq spapr_irq_xics; > +extern sPAPRIrq spapr_irq_xics_legacy; > > int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp); > void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num); > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 4a9dd4d9bc14..eba7d60a30a7 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -3971,6 +3971,7 @@ static void spapr_machine_3_0_class_options(MachineClass *mc) > SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_3_0); > > smc->legacy_irq_allocation = true; > + smc->irq = &spapr_irq_xics_legacy; > } > > DEFINE_SPAPR_MACHINE(3_0, "3.0", false); > diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c > index fe8be5f5217a..e77b94cc685e 100644 > --- a/hw/ppc/spapr_irq.c > +++ b/hw/ppc/spapr_irq.c > @@ -195,7 +195,7 @@ static void spapr_irq_print_info_xics(sPAPRMachineState *spapr, Monitor *mon) > ics_pic_print_info(spapr->ics, mon); > } > > -#define SPAPR_IRQ_XICS_NR_IRQS 0x400 > +#define SPAPR_IRQ_XICS_NR_IRQS 0x1000 > #define SPAPR_IRQ_XICS_NR_MSIS \ > (XICS_IRQ_BASE + SPAPR_IRQ_XICS_NR_IRQS - SPAPR_IRQ_MSI) > > @@ -289,3 +289,16 @@ int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp) > > return first + ics->offset; > } > + > +#define SPAPR_IRQ_XICS_LEGACY_NR_IRQS 0x400 > + > +sPAPRIrq spapr_irq_xics_legacy = { > + .nr_irqs = SPAPR_IRQ_XICS_LEGACY_NR_IRQS, > + .nr_msis = SPAPR_IRQ_XICS_LEGACY_NR_IRQS, > + > + .init = spapr_irq_init_xics, > + .claim = spapr_irq_claim_xics, > + .free = spapr_irq_free_xics, > + .qirq = spapr_qirq_xics, > + .print_info = spapr_irq_print_info_xics, > +};
On 09/13/2018 04:25 AM, David Gibson wrote: > On Tue, Sep 11, 2018 at 07:55:03AM +0200, Cédric Le Goater wrote: >> The new layout using static IRQ number does not leave much space to >> the dynamic MSI range, only 0x100 IRQ numbers. Increase the total >> number of IRQS for newer machines and introduce a legacy XICS backend >> for pre-3.1 machines to maintain compatibility. >> >> For the old backend, provide a 'nr_msis' value covering the full IRQ >> number space as it does not use the bitmap allocator to allocate MSI >> interrupt numbers. >> >> Signed-off-by: Cédric Le Goater <clg@kaod.org> > > Applied to ppc-for-3.1, thanks. I think we are ready for Xive now ? The patchset is organized as below. The patches tagged v4 have not changed but the others have and a resend will be needed. * Device models for Source, Router, EQs, Presenter, Controller : ppc/xive: introduce a XIVE interrupt source model (v4) ppc/xive: add support for the LSI interrupt sources (v4) ppc/xive: introduce the XiveFabric interface (v4) ppc/xive: introduce the XiveRouter model (v4) ppc/xive: introduce the XIVE Event Queues (v4) ppc/xive: add support for the EQ Event State buffers (v4) ppc/xive: introduce the XIVE interrupt thread context (v4) ppc/xive: introduce a simplified XIVE presenter (v4) ppc/xive: notify the CPU when the interrupt priority is more privileged (v4) spapr/xive: introduce a XIVE interrupt controller (v4) spapr/xive: use the VCPU id as a VP identifier (v5) * Integration in the sPAPR machine (we can add pnv also) spapr: initialize VSMT before initializing the IRQ backend (v5) spapr: introdude a new machine IRQ backend for XIVE (v5) spapr: add hcalls support for the XIVE exploitation interrupt mode (v5) spapr: add device tree support for the XIVE exploitation mode (v5) spapr: allocate the interrupt thread context under the CPU core (v5) spapr: add a 'pseries-3.1-xive' machine type (v5) * KVM support (KVM XIVE device interfaces) spapr: add classes for the XIVE models (v5+) target/ppc/kvm: add Linux KVM definitions for XIVE (v5+) spapr/xive: add models for KVM support (v5+) * KVM migration (more KVM XIVE device interfaces) spapr/xive: add migration support for KVM (v5+) spapr: fix XICS migration (v5+) Greg is giving it some tests on TCG and now KVM as XIVE is a building block for the OpenCAPI passthrough. Thanks, C.
diff --git a/include/hw/ppc/spapr_irq.h b/include/hw/ppc/spapr_irq.h index 650f810ad2aa..a467ce696ee4 100644 --- a/include/hw/ppc/spapr_irq.h +++ b/include/hw/ppc/spapr_irq.h @@ -41,6 +41,7 @@ typedef struct sPAPRIrq { } sPAPRIrq; extern sPAPRIrq spapr_irq_xics; +extern sPAPRIrq spapr_irq_xics_legacy; int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp); void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num); diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 4a9dd4d9bc14..eba7d60a30a7 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3971,6 +3971,7 @@ static void spapr_machine_3_0_class_options(MachineClass *mc) SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_3_0); smc->legacy_irq_allocation = true; + smc->irq = &spapr_irq_xics_legacy; } DEFINE_SPAPR_MACHINE(3_0, "3.0", false); diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c index fe8be5f5217a..e77b94cc685e 100644 --- a/hw/ppc/spapr_irq.c +++ b/hw/ppc/spapr_irq.c @@ -195,7 +195,7 @@ static void spapr_irq_print_info_xics(sPAPRMachineState *spapr, Monitor *mon) ics_pic_print_info(spapr->ics, mon); } -#define SPAPR_IRQ_XICS_NR_IRQS 0x400 +#define SPAPR_IRQ_XICS_NR_IRQS 0x1000 #define SPAPR_IRQ_XICS_NR_MSIS \ (XICS_IRQ_BASE + SPAPR_IRQ_XICS_NR_IRQS - SPAPR_IRQ_MSI) @@ -289,3 +289,16 @@ int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp) return first + ics->offset; } + +#define SPAPR_IRQ_XICS_LEGACY_NR_IRQS 0x400 + +sPAPRIrq spapr_irq_xics_legacy = { + .nr_irqs = SPAPR_IRQ_XICS_LEGACY_NR_IRQS, + .nr_msis = SPAPR_IRQ_XICS_LEGACY_NR_IRQS, + + .init = spapr_irq_init_xics, + .claim = spapr_irq_claim_xics, + .free = spapr_irq_free_xics, + .qirq = spapr_qirq_xics, + .print_info = spapr_irq_print_info_xics, +};
The new layout using static IRQ number does not leave much space to the dynamic MSI range, only 0x100 IRQ numbers. Increase the total number of IRQS for newer machines and introduce a legacy XICS backend for pre-3.1 machines to maintain compatibility. For the old backend, provide a 'nr_msis' value covering the full IRQ number space as it does not use the bitmap allocator to allocate MSI interrupt numbers. Signed-off-by: Cédric Le Goater <clg@kaod.org> --- include/hw/ppc/spapr_irq.h | 1 + hw/ppc/spapr.c | 1 + hw/ppc/spapr_irq.c | 15 ++++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-)