From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=41276 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PzsyJ-0004mi-B1 for qemu-devel@nongnu.org; Wed, 16 Mar 2011 11:49:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PzsyC-0004NG-MH for qemu-devel@nongnu.org; Wed, 16 Mar 2011 11:49:09 -0400 Received: from cantor2.suse.de ([195.135.220.15]:51713 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PzsyC-0004N3-Dj for qemu-devel@nongnu.org; Wed, 16 Mar 2011 11:49:08 -0400 Message-ID: <4D80DBF3.4000400@suse.de> Date: Wed, 16 Mar 2011 16:49:07 +0100 From: Alexander Graf MIME-Version: 1.0 References: <1300251423-6715-1-git-send-email-david@gibson.dropbear.id.au> <1300251423-6715-20-git-send-email-david@gibson.dropbear.id.au> In-Reply-To: <1300251423-6715-20-git-send-email-david@gibson.dropbear.id.au> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 19/26] Add PAPR H_VIO_SIGNAL hypercall and infrastructure for VIO interrupts List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Gibson Cc: paulus@samba.org, qemu-devel@nongnu.org, anton@samba.org On 03/16/2011 05:56 AM, David Gibson wrote: > This patch adds infrastructure to support interrupts from PAPR virtual IO > devices. This includes correctly advertising those interrupts in the > device tree, and implementing the H_VIO_SIGNAL hypercall, used to > enable and disable individual device interrupts. > > Signed-off-by: David Gibson > --- > hw/spapr.c | 2 +- > hw/spapr_vio.c | 34 ++++++++++++++++++++++++++++++++++ > hw/spapr_vio.h | 6 ++++++ > 3 files changed, 41 insertions(+), 1 deletions(-) > > diff --git a/hw/spapr.c b/hw/spapr.c > index be30def..5b19963 100644 > --- a/hw/spapr.c > +++ b/hw/spapr.c > @@ -62,7 +62,7 @@ static void *spapr_create_fdt(int *fdt_size, ram_addr_t ramsize, > uint32_t start_prop = cpu_to_be32(initrd_base); > uint32_t end_prop = cpu_to_be32(initrd_base + initrd_size); > uint32_t pft_size_prop[] = {0, cpu_to_be32(hash_shift)}; > - char hypertas_prop[] = "hcall-pft\0hcall-term\0hcall-dabr"; > + char hypertas_prop[] = "hcall-pft\0hcall-term\0hcall-dabr\0hcall-interrupt"; > uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(smp_cpus)}; > int i; > char *modelname; > diff --git a/hw/spapr_vio.c b/hw/spapr_vio.c > index 0ed63f4..45edd94 100644 > --- a/hw/spapr_vio.c > +++ b/hw/spapr_vio.c > @@ -105,6 +105,15 @@ static int vio_make_devnode(VIOsPAPRDevice *dev, > } > } > > + if (dev->qirq) { > + uint32_t ints_prop[] = {cpu_to_be32(dev->vio_irq_num), 0}; > + > + ret = fdt_setprop(fdt, node_off, "interrupts", ints_prop, > + sizeof(ints_prop)); > + if (ret< 0) Braces > + return ret; > + } > + > if (info->devnode) { > ret = (info->devnode)(dev, fdt, node_off); > if (ret< 0) { > @@ -140,6 +149,28 @@ void spapr_vio_bus_register_withprop(VIOsPAPRDeviceInfo *info) > qdev_register(&info->qdev); > } > > +static target_ulong h_vio_signal(CPUState *env, sPAPREnvironment *spapr, > + target_ulong opcode, > + target_ulong *args) > +{ > + target_ulong reg = args[0]; > + target_ulong mode = args[1]; > + VIOsPAPRDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg); > + VIOsPAPRDeviceInfo *info; > + > + if (!dev) Braces > + return H_PARAMETER; > + > + info = (VIOsPAPRDeviceInfo *)dev->qdev.info; > + > + if (mode& ~info->signal_mask) Braces > + return H_PARAMETER;; > + > + dev->signal_state = mode; No need to notify the device? Alex