From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43644) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YAexx-0000WC-Tc for qemu-devel@nongnu.org; Mon, 12 Jan 2015 08:23:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YAext-0003l2-NJ for qemu-devel@nongnu.org; Mon, 12 Jan 2015 08:23:33 -0500 Received: from mail-we0-f176.google.com ([74.125.82.176]:44057) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YAext-0003kv-HO for qemu-devel@nongnu.org; Mon, 12 Jan 2015 08:23:29 -0500 Received: by mail-we0-f176.google.com with SMTP id w61so18985823wes.7 for ; Mon, 12 Jan 2015 05:23:29 -0800 (PST) From: Baptiste Reynal Date: Mon, 12 Jan 2015 14:21:42 +0100 Message-Id: <1421068903-8981-4-git-send-email-b.reynal@virtualopensystems.com> In-Reply-To: <1421068903-8981-1-git-send-email-b.reynal@virtualopensystems.com> References: <1421068903-8981-1-git-send-email-b.reynal@virtualopensystems.com> Subject: [Qemu-devel] [RFC PATCH 3/4] hw/arm/sysbus-fdt: vfio device property for interrupts List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, kvmarm@lists.cs.columbia.edu Cc: Peter Maydell , tech@virtualopensystems.com, Baptiste Reynal , eric.auger@linaro.org Use the VFIO device property API to retrieve interrupt information (type and flags) during device node creation. Signed-off-by: Baptiste Reynal --- hw/arm/sysbus-fdt.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/hw/arm/sysbus-fdt.c b/hw/arm/sysbus-fdt.c index efdeea7..087e788 100644 --- a/hw/arm/sysbus-fdt.c +++ b/hw/arm/sysbus-fdt.c @@ -31,6 +31,7 @@ #include "hw/vfio/vfio-pl330.h" #include +#include /* * internal struct that contains the information to create dynamic @@ -66,7 +67,7 @@ typedef struct NodeCreationPair { * Helper function, generate interrupts property for a given node */ static int set_interrupts_fdt_node(char *nodename, SysBusDevice *sbdev, - void *opaque, int type, int flags) + void *opaque) { PlatformBusFdtData *data = opaque; PlatformBusDevice *pbus = data->pbus; @@ -76,23 +77,32 @@ static int set_interrupts_fdt_node(char *nodename, SysBusDevice *sbdev, int i, ret; VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(sbdev); VFIODevice *vbasedev = &vdev->vbasedev; + struct vfio_dev_property *irq_prop; + + irq_prop = vfio_get_dev_property(vbasedev->fd, "interrupts", + VFIO_DEV_PROPERTY_TYPE_U32); + + if (irq_prop == NULL) { + return -1; + } irq_attr = g_new(uint32_t, vbasedev->num_irqs*3); for (i = 0; i < vbasedev->num_irqs; i++) { irq_number = platform_bus_get_irqn(pbus, sbdev , i) + data->irq_start; - irq_attr[3*i] = cpu_to_be32(type); + irq_attr[3*i] = cpu_to_be32(((__u32 *) irq_prop->data)[3*i]); irq_attr[3*i+1] = cpu_to_be32(irq_number); - irq_attr[3*i+2] = cpu_to_be32(flags); + irq_attr[3*i+2] = cpu_to_be32(((__u32 *) irq_prop->data)[3*i+2]); } - ret = qemu_fdt_setprop(fdt, nodename, "interrupts", - irq_attr, vbasedev->num_irqs*3*sizeof(uint32_t)); + ret = qemu_fdt_setprop(fdt, nodename, "interrupts", + irq_attr, vbasedev->num_irqs*3*sizeof(uint32_t)); g_free(irq_attr); + g_free(irq_prop); - return ret; + return ret; } /** @@ -168,7 +178,7 @@ static int add_calxeda_midway_xgmac_fdt_node(SysBusDevice *sbdev, void *opaque) goto fail; } - ret = set_interrupts_fdt_node(nodename, sbdev, opaque, 0, 0x4); + ret = set_interrupts_fdt_node(nodename, sbdev, opaque); if (ret < 0) { error_report("could not set interrupts property of node %s", @@ -248,7 +258,7 @@ static int add_arm_pl330_fdt_node(SysBusDevice *sbdev, void *opaque) goto fail; } - ret = set_interrupts_fdt_node(nodename, sbdev, opaque, 0, 0x4); + ret = set_interrupts_fdt_node(nodename, sbdev, opaque); if (ret < 0) { error_report("could not set interrupts property of node %s", -- 2.2.1