[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [RFC PATCH v2 06/21] ppc/xive: introduce handlers for int
From: |
David Gibson |
Subject: |
Re: [Qemu-ppc] [RFC PATCH v2 06/21] ppc/xive: introduce handlers for interrupt sources |
Date: |
Tue, 19 Sep 2017 12:48:49 +1000 |
User-agent: |
Mutt/1.8.3 (2017-05-23) |
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 <address@hidden>
> ---
> 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
[Qemu-ppc] [RFC PATCH v2 07/21] ppc/xive: add MMIO handlers for the XIVE interrupt sources, Cédric Le Goater, 2017/09/11
Re: [Qemu-ppc] [RFC PATCH v2 07/21] ppc/xive: add MMIO handlers for the XIVE interrupt sources, Cédric Le Goater, 2017/09/20
Re: [Qemu-ppc] [RFC PATCH v2 07/21] ppc/xive: add MMIO handlers for the XIVE interrupt sources, David Gibson, 2017/09/22