From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46504) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WYEKP-0002rN-UX for qemu-devel@nongnu.org; Thu, 10 Apr 2014 08:43:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WYEKJ-0006RM-Ik for qemu-devel@nongnu.org; Thu, 10 Apr 2014 08:43:37 -0400 Message-ID: <534691F2.2010507@suse.de> Date: Thu, 10 Apr 2014 14:43:30 +0200 From: Alexander Graf MIME-Version: 1.0 References: <1394770689-29039-1-git-send-email-aik@ozlabs.ru> <1394770689-29039-3-git-send-email-aik@ozlabs.ru> In-Reply-To: <1394770689-29039-3-git-send-email-aik@ozlabs.ru> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 2/8] xics: add flags for interrupts List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy , qemu-devel@nongnu.org Cc: qemu-ppc@nongnu.org, =?ISO-8859-1?Q?Andreas_F=E4rber?= On 14.03.14 05:18, Alexey Kardashevskiy wrote: > We will need soon an "allocated" flag for every interrupt to support > interrupt configuration change which may happen during migration. > > This replaces a separate lslsi[] array with a byte in the ICSIRQState > struct and defines "LSI" and "MSI" flags. Neither of these flags set > signals that the descriptor is not in use. > > Signed-off-by: Alexey Kardashevskiy > --- > hw/intc/xics.c | 17 +++++++++++------ > hw/intc/xics_kvm.c | 5 ++--- > include/hw/ppc/xics.h | 4 +++- > 3 files changed, 16 insertions(+), 10 deletions(-) > > diff --git a/hw/intc/xics.c b/hw/intc/xics.c > index 64aabe7..7eac85a 100644 > --- a/hw/intc/xics.c > +++ b/hw/intc/xics.c > @@ -438,7 +438,7 @@ static void ics_set_irq(void *opaque, int srcno, int val) > { > ICSState *ics = (ICSState *)opaque; > > - if (ics->islsi[srcno]) { > + if (ics->irqs[srcno].flags & XICS_FLAGS_LSI) { > set_irq_lsi(ics, srcno, val); > } else { > set_irq_msi(ics, srcno, val); > @@ -475,7 +475,7 @@ static void ics_write_xive(ICSState *ics, int nr, int server, > > trace_xics_ics_write_xive(nr, srcno, server, priority); > > - if (ics->islsi[srcno]) { > + if (ics->irqs[srcno].flags & XICS_FLAGS_LSI) { > write_xive_lsi(ics, srcno); > } else { > write_xive_msi(ics, srcno); > @@ -497,7 +497,7 @@ static void ics_resend(ICSState *ics) > > for (i = 0; i < ics->nr_irqs; i++) { > /* FIXME: filter by server#? */ > - if (ics->islsi[i]) { > + if (ics->irqs[i].flags & XICS_FLAGS_LSI) { > resend_lsi(ics, i); > } else { > resend_msi(ics, i); > @@ -512,7 +512,7 @@ static void ics_eoi(ICSState *ics, int nr) > > trace_xics_ics_eoi(nr); > > - if (ics->islsi[srcno]) { > + if (ics->irqs[srcno].flags & XICS_FLAGS_LSI) { > irq->status &= ~XICS_STATUS_SENT; > } > } > @@ -609,7 +609,6 @@ static void ics_realize(DeviceState *dev, Error **errp) > return; > } > ics->irqs = g_malloc0(ics->nr_irqs * sizeof(ICSIRQState)); > - ics->islsi = g_malloc0(ics->nr_irqs * sizeof(bool)); > ics->qirqs = qemu_allocate_irqs(ics_set_irq, ics, ics->nr_irqs); > } > > @@ -646,11 +645,17 @@ qemu_irq xics_get_qirq(XICSState *icp, int irq) > return icp->ics->qirqs[irq - icp->ics->offset]; > } > > +static void ics_set_irq_type(ICSState *ics, int irq, bool lsi) > +{ > + ics->irqs[irq - ics->offset].flags |= > + lsi ? XICS_FLAGS_LSI : XICS_FLAGS_MSI; If I configure an IRQ as LSI then as MSI this doesn't work. Sure, we probably don't do this but in general this is not how a "set" function should behave. Alex