From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41411) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XRhhs-0003l2-Ep for qemu-devel@nongnu.org; Wed, 10 Sep 2014 09:13:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XRhhk-00064F-NG for qemu-devel@nongnu.org; Wed, 10 Sep 2014 09:13:08 -0400 Received: from cantor2.suse.de ([195.135.220.15]:50552 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XRhhk-000637-CG for qemu-devel@nongnu.org; Wed, 10 Sep 2014 09:13:00 -0400 Message-ID: <54104E5A.5060505@suse.de> Date: Wed, 10 Sep 2014 15:12:58 +0200 From: Alexander Graf MIME-Version: 1.0 References: <1410247876-4967-1-git-send-email-eric.auger@linaro.org> <1410247876-4967-12-git-send-email-eric.auger@linaro.org> In-Reply-To: <1410247876-4967-12-git-send-email-eric.auger@linaro.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v6 11/16] hw/arm/dyn_sysbus_devtree: enable vfio-calxeda-xgmac dynamic instantiation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Eric Auger , eric.auger@st.com, christoffer.dall@linaro.org, qemu-devel@nongnu.org, a.rigo@virtualopensystems.com, kim.phillips@freescale.com, marc.zyngier@arm.com, manish.jaggi@caviumnetworks.com, joel.schopp@amd.com, peter.maydell@linaro.org, pbonzini@redhat.com, afaerber@suse.de Cc: patches@linaro.org, will.deacon@arm.com, stuart.yoder@freescale.com, Bharat.Bhushan@freescale.com, alex.williamson@redhat.com, a.motakis@virtualopensystems.com, kvmarm@lists.cs.columbia.edu On 09.09.14 09:31, Eric Auger wrote: > vfio-calxeda-xgmac now can be instantiated using the -device option > > Signed-off-by: Eric Auger > > --- > > v2 -> v3: > - correct bug of reg_attr[2*i] in vfio_fdt_add_device_node > - fix a bug related to compat_str_len computed on original compat > instead of corrected compat > - wrap_vfio_fdt_add_node take a node creation function: this function > needs to be specialized for each VFIO device. wrap function must be > called in sysbus_device_create_devtree > --- > hw/arm/dyn_sysbus_devtree.c | 141 ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 141 insertions(+) > > diff --git a/hw/arm/dyn_sysbus_devtree.c b/hw/arm/dyn_sysbus_devtree.c > index 61e5b5f..3ef9430 100644 > --- a/hw/arm/dyn_sysbus_devtree.c > +++ b/hw/arm/dyn_sysbus_devtree.c > @@ -20,6 +20,141 @@ > #include "hw/arm/dyn_sysbus_devtree.h" > #include "qemu/error-report.h" > #include "sysemu/device_tree.h" > +#include "hw/vfio/vfio-platform.h" > +#include "hw/vfio/vfio-calxeda-xgmac.h" > + > +typedef void (*vfio_fdt_add_device_node_t)(SysBusDevice *sbdev, void *opaque); > + > +static char *format_compat(char * compat) > +{ > + char *str_ptr, *corrected_compat; > + /* > + * process compatibility property string passed by end-user > + * replaces / by , and ; by NUL character > + */ > + corrected_compat = g_strdup(compat); > + > + str_ptr = corrected_compat; > + while ((str_ptr = strchr(str_ptr, '/')) != NULL) { > + *str_ptr = ','; > + } > + > + /* substitute ";" with the NUL char */ > + str_ptr = corrected_compat; > + while ((str_ptr = strchr(str_ptr, ';')) != NULL) { > + *str_ptr = '\0'; > + } > + > + /* > + * corrected compat includes a "\0" before or at the same location > + * as compat's one > + */ > + return corrected_compat; > +} > + > +static void wrap_vfio_fdt_add_node(SysBusDevice *sbdev, void *opaque, > + vfio_fdt_add_device_node_t add_node_fn) > +{ > + PlatformDevtreeData *data = opaque; > + VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(sbdev); > + VFIODevice *vbasedev = &vdev->vbasedev; > + gchar irq_number_prop[8]; > + Object *obj = OBJECT(sbdev); > + char *corrected_compat; > + uint64_t irq_number; > + int corrected_compat_str_len, i; > + > + corrected_compat = format_compat(vdev->compat); > + corrected_compat_str_len = strlen(corrected_compat) + 1; > + /* we copy the corrected_compat string + its "\0" */ > + snprintf(vdev->compat, corrected_compat_str_len, "%s", corrected_compat); > + g_free(corrected_compat); > + > + add_node_fn(sbdev, opaque); > + > + for (i = 0; i < vbasedev->num_irqs; i++) { > + snprintf(irq_number_prop, sizeof(irq_number_prop), "irq[%d]", i); > + irq_number = object_property_get_int(obj, irq_number_prop, NULL) > + + data->irq_start; > + /* > + * for setting irqfd up we must provide the virtual IRQ number > + * which is the sum of irq_start and actual platform bus irq > + * index. At realize point we do not have this info. > + */ > + vfio_start_irq_injection(sbdev, i, irq_number); Does this really have anything to do with fdt? Also, don't we have notifiers that call IRQ holders when an IRQ gets connected? That would probably be the cleaner approach here. Alex