qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: "Cédric Le Goater" <clg@kaod.org>
Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>
Subject: Re: [Qemu-devel] [PATCH v3 03/35] ppc/xive: introduce the XiveFabric interface
Date: Fri, 27 Apr 2018 16:32:11 +1000	[thread overview]
Message-ID: <20180427063211.GO8800@umbus.fritz.box> (raw)
In-Reply-To: <b11688ae-a08f-320f-2bb5-46262ccb6376@kaod.org>

[-- Attachment #1: Type: text/plain, Size: 8524 bytes --]

On Thu, Apr 26, 2018 at 12:30:42PM +0200, Cédric Le Goater wrote:
> On 04/26/2018 05:54 AM, David Gibson wrote:
> > On Tue, Apr 24, 2018 at 11:33:11AM +0200, Cédric Le Goater wrote:
> >> On 04/24/2018 08:46 AM, David Gibson wrote:
> >>> On Mon, Apr 23, 2018 at 09:58:43AM +0200, Cédric Le Goater wrote:
> >>>> On 04/23/2018 08:46 AM, David Gibson wrote:
> >>>>> On Thu, Apr 19, 2018 at 02:42:59PM +0200, Cédric Le Goater wrote:
> >>>>>> The XiveFabric offers a simple interface, between the XiveSourve
> >>>>>> object and the device model owning the interrupt sources, to forward
> >>>>>> an event notification to the XIVE interrupt controller of the machine
> >>>>>> and if the owner is the controller, to call directly the routing
> >>>>>> sub-engine.
> >>>>>>
> >>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >>>>>> ---
> >>>>>>  hw/intc/xive.c        | 37 ++++++++++++++++++++++++++++++++++++-
> >>>>>>  include/hw/ppc/xive.h | 25 +++++++++++++++++++++++++
> >>>>>>  2 files changed, 61 insertions(+), 1 deletion(-)
> >>>>>>
> >>>>>> diff --git a/hw/intc/xive.c b/hw/intc/xive.c
> >>>>>> index 060976077dd7..b4c3d06c1219 100644
> >>>>>> --- a/hw/intc/xive.c
> >>>>>> +++ b/hw/intc/xive.c
> >>>>>> @@ -17,6 +17,21 @@
> >>>>>>  #include "hw/ppc/xive.h"
> >>>>>>  
> >>>>>>  /*
> >>>>>> + * XIVE Fabric
> >>>>>> + */
> >>>>>> +
> >>>>>> +static void xive_fabric_route(XiveFabric *xf, int lisn)
> >>>>>> +{
> >>>>>> +
> >>>>>> +}
> >>>>>> +
> >>>>>> +static const TypeInfo xive_fabric_info = {
> >>>>>> +    .name = TYPE_XIVE_FABRIC,
> >>>>>> +    .parent = TYPE_INTERFACE,
> >>>>>> +    .class_size = sizeof(XiveFabricClass),
> >>>>>> +};
> >>>>>> +
> >>>>>> +/*
> >>>>>>   * XIVE Interrupt Source
> >>>>>>   */
> >>>>>>  
> >>>>>> @@ -97,11 +112,19 @@ static bool xive_source_pq_trigger(XiveSource *xsrc, uint32_t srcno)
> >>>>>>  
> >>>>>>  /*
> >>>>>>   * Forward the source event notification to the associated XiveFabric,
> >>>>>> - * the device owning the sources.
> >>>>>> + * the device owning the sources, or perform the routing if the device
> >>>>>> + * is the interrupt controller.
> >>>>>>   */
> >>>>>>  static void xive_source_notify(XiveSource *xsrc, int srcno)
> >>>>>>  {
> >>>>>>  
> >>>>>> +    XiveFabricClass *xfc = XIVE_FABRIC_GET_CLASS(xsrc->xive);
> >>>>>> +
> >>>>>> +    if (xfc->notify) {
> >>>>>> +        xfc->notify(xsrc->xive, srcno + xsrc->offset);
> >>>>>> +    } else {
> >>>>>> +        xive_fabric_route(xsrc->xive, srcno + xsrc->offset);
> >>>>>> +    }
> >>>>>
> >>>>> Why 2 cases?  Can't the XiveFabric object just make its notify equal
> >>>>> to xive_fabric_route if that's what it wants?
> >>>> Under sPAPR, all the sources, IPIs and virtual device interrupts, 
> >>>> generate events which are directly routed by xive_fabric_route(). 
> >>>> There is no need of an extra hop. Indeed. 
> >>>
> >>> Ok.
> >>>
> >>>> Under PowerNV, some sources forward the notification to the routing 
> >>>> engine using a specific MMIO load on a notify address which is stored 
> >>>> in one of the controller registers. So we need a hop to reach the 
> >>>> device model, owning the sources, and do that load :
> >>>
> >>> Hm.  So you're saying that in pnv some sources send their notification
> >>> to some other unit, 
> >>
> >> Not to any unit/device, to the device owning the sources.
> >>
> >> For the XiveSource object under PSI, the XIVEFabric interface is the 
> >> PSI device object it self, which knows how to forward the notification 
> >> on the XIVE Power "bus". To be more precise, the PSI HB device has 
> >> 14 interrupt sources, which notifications are forwarded using a MMIO 
> >> load to some address. The load address is configured (by skiboot) in 
> >> one of the PSI device registers, and points to a MMIO region of the 
> >> main XIVE interrupt controller. 
> >>
> >> The PHB4 sources should be the same.
> >>
> >> For the XiveSource object (all interrupts) under sPAPRXive, the 
> >> XIVEFabric is the main interrupt controller sPAPRXive.
> >>
> >> For the XiveSource object (IPIs) under PnvXive, the XIVEFabric is 
> >> also the main interrupt controller PnvXive.
> > 
> > Hrm.  Apparently I'm missing something, I'm really not getting what
> > you're trying to explain here.
> 
> I see that. Let's try again.
> 
> >>> that would then (after possible masking) forward on to the overall> xive fabric ? 
> >>
> >> yes. May be XIVEFabric is a confusing name. What about XIVEForwarder ? 
> > 
> > Maybe..?
> > 
> >>> That seems like a property of the source object, 
> >>
> >> The source object is generic. It's a bunch of PQ bits that can be 
> >> controlled by MMIOs. Nothing more.
> > 
> > Hmm.  Isn't the source object also responsible for forwarding the
> > interrupt to something up the chain (whatever that is)?
> 
> Yes but it can not forward directly. The XiveSource is generic and 
> can only call a handler :
> 
> 	xfc->notify(xsrc->xive, srcno + xsrc->offset);

But.. your patch doesn't do that always, it's conditional which I
still don't understand.

> The device model owner, the parent of the XiveSource object, would 
> do the real forward.

Why?  I mean the XiveSource basically represents the xive irq related
logic of the PHB or whatever, why would it not represent *all* of
that, rather than just the ESB bits, meaning the owner has to have
some more xive logic for the forwarding.

Note that I don't think the fact that some sources notify via mmio and
some are internal really matters.  It's not like we're modelling the
power bus down to the wire-transaction level.

> It's very similar to what we have today with XICS :
> 
> 	- The sPAPR model has an ICSState  
> 	- The PnvPSI model has an ICSState 
> 	- The PnvPHB3 model has two ICSStates
> 
> and the 'xics' pointer in ICSState points to the 'interrupt unit' of 
> the machine to do resends and to grab ICPs. So it used for routing 
> essentially.

Hmm.  I think you and I are looking at XICSFabric kind of
differently.  As I see it, it's not really an active component at
all.  Rather it's basically a global "map" of the xics components so
that they can find each other.

> in Xive 
> 
> 	- sPAPRXive model has a XiveSource
> 	- PnvXive model has a XiveSource
> 	- PnvPSI model has a XiveSource
> 	- PnvPHB4 model should have also.
> 
> and the 'xive' pointer in XiveSource points to the parent object,

Uh.. yeah.. the xics pointer in ICS units doesn't point to the parent
object, except maybe by accident.  It's absolutely intended to be
global, and so points to the machine.

> which will handle the event notification forwarding or routing.

Ok, how about this for a partial model.  We have:

XiveSource objects:
	* Owns an ESB table
	* Knows the mapping of its local irq offsets to global irq
	  numbers
	* Provides the mmio interface for ESB manipulation
	* When neccessary, notifies a new interrupt to a XiveRouter

XiveRouter objects:
	* Responsible for a fixed range of global irq numbers
	* Owns an IVT (but what that means can vary, see below)
	* When notified of an irq, routes it to the appropriate EQ
	  (haven't thought about this part yet)
	* Abstract class - needs subclasses to define how to get IVEs

XiveFabric interface:
	* Lets XIVE components locate each other
	* get_router() method: maps a global irq number to XiveRouter
	  object
	* Always global (implemented on the machine)

On pseries we have:

	? XiveSource objects.  We probably only need one, but 1 for
	LSI and one for MSI might be convenient.  More wouldn't break
	the model

	1 sPAPRXiveRouter.  This is a subclass of XiveRouter that
	holds the IVT internall (and migrates it).

	the XiveFabric implementation always returns the single global
	router for get_router()

On powernv we have:
	N XiveSource objects.  Some in PHBs, some extra ones on each
	chip

	(#chips) PowerXiveRouter objects.  This subclass of XiveRouter
	stores the register giving the IVT base address and migrates
	that, but the IVT contents are in RAM

	the XiveFabric get_router() implementation returns the right
	chip's router based on the irq number

Obviously the router->EQ sides still needs a bunch of thought.

-- 
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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2018-04-27  6:32 UTC|newest]

Thread overview: 100+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-19 12:42 [Qemu-devel] [PATCH v3 00/35] ppc: support for the XIVE interrupt controller (POWER9) Cédric Le Goater
2018-04-19 12:42 ` [Qemu-devel] [PATCH v3 01/35] ppc/xive: introduce a XIVE interrupt source model Cédric Le Goater
2018-04-20  7:10   ` David Gibson
2018-04-20  8:27     ` Cédric Le Goater
2018-04-23  3:59       ` David Gibson
2018-04-23  7:11         ` Cédric Le Goater
2018-04-24  1:24           ` David Gibson
2018-04-19 12:42 ` [Qemu-devel] [PATCH v3 02/35] ppc/xive: add support for the LSI interrupt sources Cédric Le Goater
2018-04-23  6:44   ` David Gibson
2018-04-23  7:31     ` Cédric Le Goater
2018-04-24  6:41       ` David Gibson
2018-04-24  8:11         ` Cédric Le Goater
2018-04-26  3:28           ` David Gibson
2018-04-26 12:16             ` Cédric Le Goater
2018-04-27  2:43               ` David Gibson
2018-05-04 14:25                 ` Cédric Le Goater
2018-05-05  4:32                   ` David Gibson
2018-04-19 12:42 ` [Qemu-devel] [PATCH v3 03/35] ppc/xive: introduce the XiveFabric interface Cédric Le Goater
2018-04-23  6:46   ` David Gibson
2018-04-23  7:58     ` Cédric Le Goater
2018-04-24  6:46       ` David Gibson
2018-04-24  9:33         ` Cédric Le Goater
2018-04-26  3:54           ` David Gibson
2018-04-26 10:30             ` Cédric Le Goater
2018-04-27  6:32               ` David Gibson [this message]
2018-05-02 15:28                 ` Cédric Le Goater
2018-05-03  5:13                   ` David Gibson
2018-05-23 10:12                     ` Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 04/35] spapr/xive: introduce a XIVE interrupt controller for sPAPR Cédric Le Goater
2018-04-24  6:51   ` David Gibson
2018-04-24  9:46     ` Cédric Le Goater
2018-04-26  4:20       ` David Gibson
2018-04-26 10:43         ` Cédric Le Goater
2018-05-03  5:22           ` David Gibson
2018-05-03 16:50             ` Cédric Le Goater
2018-05-04  3:33               ` David Gibson
2018-05-04 13:05                 ` Cédric Le Goater
2018-05-05  4:26                   ` David Gibson
2018-05-09  7:23                     ` Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 05/35] spapr/xive: add a single source block to the sPAPR XIVE model Cédric Le Goater
2018-04-24  6:58   ` David Gibson
2018-04-24  8:19     ` Cédric Le Goater
2018-04-26  4:46       ` David Gibson
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 06/35] spapr/xive: introduce a XIVE interrupt presenter model Cédric Le Goater
2018-04-26  7:11   ` David Gibson
2018-04-26  9:27     ` Cédric Le Goater
2018-04-26 17:15       ` Cédric Le Goater
2018-05-03  5:39         ` David Gibson
2018-05-03 15:10           ` Cédric Le Goater
2018-05-04  4:44             ` David Gibson
2018-05-04 14:15               ` Cédric Le Goater
2018-05-03  5:35       ` David Gibson
2018-05-03 16:06         ` Cédric Le Goater
2018-05-04  4:51           ` David Gibson
2018-05-04 13:11             ` Cédric Le Goater
2018-05-05  4:27               ` David Gibson
2018-05-09  7:27                 ` Cédric Le Goater
2018-05-02  7:39     ` Cédric Le Goater
2018-05-03  5:43       ` David Gibson
2018-05-03 14:42         ` Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 07/35] spapr/xive: introduce the XIVE Event Queues Cédric Le Goater
2018-04-26  7:25   ` David Gibson
2018-04-26  9:48     ` Cédric Le Goater
2018-05-03  5:45       ` David Gibson
2018-05-03  6:07         ` Cédric Le Goater
2018-05-03  6:25           ` David Gibson
2018-05-03 14:37             ` Cédric Le Goater
2018-05-04  5:19               ` David Gibson
2018-05-04 13:29                 ` Cédric Le Goater
2018-05-05  4:29                   ` David Gibson
2018-05-09  8:01                     ` Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 08/35] spapr: push the XIVE EQ data in OS event queue Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 09/35] spapr: notify the CPU when the XIVE interrupt priority is more privileged Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 10/35] spapr: add support for the SET_OS_PENDING command (XIVE) Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 11/35] spapr: introduce a 'xive_exploitation' option to enable XIVE Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 12/35] spapr: add a sPAPRXive object to the machine Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 13/35] spapr: add hcalls support for the XIVE exploitation interrupt mode Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 14/35] spapr: add device tree support for the XIVE exploitation mode Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 15/35] sysbus: add a sysbus_mmio_unmap() helper Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 16/35] spapr: introduce a helper to map the XIVE memory regions Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 17/35] spapr: add XIVE support to spapr_qirq() Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 18/35] spapr: introduce a spapr_icp_create() helper Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 19/35] spapr: toggle the ICP depending on the selected interrupt mode Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 20/35] spapr: add support to dump XIVE information Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 21/35] spapr: advertise XIVE exploitation mode in CAS Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 22/35] spapr: add classes for the XIVE models Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 23/35] target/ppc/kvm: add Linux KVM definitions for XIVE Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 24/35] spapr/xive: add common realize routine for KVM Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 25/35] spapr/xive: add KVM support Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 26/35] spapr/xive: add a XIVE KVM device to the machine Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 27/35] migration: discard non-migratable RAMBlocks Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 28/35] intc: introduce a CPUIntc interface Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 29/35] spapr/xive, xics: use the CPU_INTC handlers to reset KVM Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 30/35] spapr/xive, xics: reset KVM at machine reset Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 31/35] spapr/xive: raise migration priority of the machine Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 32/35] ppc/pnv: introduce a pnv_icp_create() helper Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 33/35] ppc: externalize ppc_get_vcpu_by_pir() Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 34/35] ppc/pnv: add XIVE support Cédric Le Goater
2018-04-19 12:43 ` [Qemu-devel] [PATCH v3 35/35] ppc/pnv: add a PSI bridge model for POWER9 processor Cédric Le Goater
2018-04-19 13:28 ` [Qemu-devel] [PATCH v3 00/35] ppc: support for the XIVE interrupt controller (POWER9) no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180427063211.GO8800@umbus.fritz.box \
    --to=david@gibson.dropbear.id.au \
    --cc=benh@kernel.crashing.org \
    --cc=clg@kaod.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).