David,
On 11/09/2017 10:14 AM, Cédric Le Goater wrote:
> Hello,
>
> Currently, the ICSState 'ics' object of the sPAPR machine acts as the
> global interrupt source handler and also as the IRQ number allocator
> for the machine. Some IRQ numbers are allocated very early in the
> machine initialization sequence to populate the device tree, and this
> is a problem to introduce the new POWER XIVE interrupt model, as it
> needs to share the IRQ numbers with the older model.
>
> To prepare ground for XIVE, here is a proposal adding a set of new
> XICSFabric operations to let the machine handle directly the IRQ
> number allocation and to decorrelate the allocation from the interrupt
> source object :
>
> bool (*irq_test)(XICSFabric *xi, int irq);
> int (*irq_alloc_block)(XICSFabric *xi, int count, int align);
> void (*irq_free_block)(XICSFabric *xi, int irq, int num);
> bool (*irq_is_lsi)(XICSFabric *xi, int irq);
>
> In these prototypes, the 'irq' parameter refers to a number in the
> global IRQ number space.
>
> On the sPAPR platform, these operations are simply backed by a bitmap
> and to handle migration compatibility, we introduce a machine class
> flag 'has_irq_bitmap', which is set to false for older machines.
Talking with Greg, I have found a better solution to handle migration
compatibility which is to do like the phb_placement. That is to use
two sets of XICS IRQ operations : one for the latest pseries machine
using the bitmap and another one for the older pseries machine using
the ICSIRQState. It impacts mostly patch 5.
This solution is cleaner and I will send a v3 in my morning unless
you start reviewing and have some obvious comments in the v2 series.
Thanks,
C.
> To completely remove the use of the ICSState object (required to
> introduce XIVE), we also need to change how the nature of an
> interrupt, MSI or LSI, is stored. Today, this is done using the flag
> attribute of the ICSIRQState array. We change that by splitting the
> IRQ number space of the machine in two: first the LSIs and then the
> MSIs. This has the benefit to keep the LSI IRQ numbers in a well known
> range which is useful for PHB hotplug.
>
> The git repo for this pachset can be found here along with the latest
> XIVE model:
>
> https://github.com/legoater/qemu/commits/xive
>
> Thanks,
>
> C.
>
> Tests :
>
> - make check on each patch
> - migration :
> qemu-2.12 (pseries-2.12) <-> qemu-2.12 (pseries-2.12)
> qemu-2.12 (pseries-2.10) <-> qemu-2.12 (pseries-2.10)
> qemu-2.10 (pseries-2.10) <-> qemu-2.12 (pseries-2.10)
>
> Changes since v1 :
>
> - reorganised patchset to introduce the XICSFabric operations before
> the major changes: bitmap and IRQ number space split
> - introduced a reference bitmap to save some state in migration
>
> Cédric Le Goater (12):
> spapr: add pseries 2.12 machine type
> ppc/xics: remove useless if condition
> spapr: introduce new XICSFabric operations for an IRQ allocator
> spapr: move current IRQ allocation under the machine
> spapr: introduce an IRQ allocator using a bitmap
> spapr: store a reference IRQ bitmap
> spapr: introduce an 'irq_base' number
> spapr: remove the use of ics_valid_irq()
> spapr: introduce a XICSFabric is_lsi() operation
> spapr: split the IRQ number space for LSI interrupts
> sparp: merge ics_set_irq_type() in irq_alloc_block() operation
> spapr: use sPAPRMachineState in spapr_ics_ prototypes
>
> hw/intc/trace-events | 2 -
> hw/intc/xics.c | 37 ++++++-----
> hw/intc/xics_kvm.c | 4 +-
> hw/intc/xics_spapr.c | 76 ++++-----------------
> hw/ppc/pnv.c | 34 ++++++++++
> hw/ppc/pnv_psi.c | 4 --
> hw/ppc/spapr.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++-
> hw/ppc/spapr_events.c | 4 +-
> hw/ppc/spapr_pci.c | 8 +--
> hw/ppc/spapr_vio.c | 2 +-
> hw/ppc/trace-events | 2 +
> include/hw/ppc/spapr.h | 6 ++
> include/hw/ppc/xics.h | 20 ++++--
> 13 files changed, 267 insertions(+), 106 deletions(-)
>