From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45476) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XS5Ew-000594-PK for qemu-devel@nongnu.org; Thu, 11 Sep 2014 10:20:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XS5Ep-0007Zo-Lu for qemu-devel@nongnu.org; Thu, 11 Sep 2014 10:20:49 -0400 Received: from mail-wi0-f173.google.com ([209.85.212.173]:49984) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XS5Ep-0007ZO-AJ for qemu-devel@nongnu.org; Thu, 11 Sep 2014 10:20:43 -0400 Received: by mail-wi0-f173.google.com with SMTP id em10so1037393wid.6 for ; Thu, 11 Sep 2014 07:20:35 -0700 (PDT) Message-ID: <5411AF99.5060608@linaro.org> Date: Thu, 11 Sep 2014 16:20:09 +0200 From: Eric Auger 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> <54104E5A.5060505@suse.de> In-Reply-To: <54104E5A.5060505@suse.de> 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: Alexander Graf , 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/10/2014 03:12 PM, Alexander Graf wrote: > > > 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? No it doesn't, I aknowledge ;-) Also, don't we have > notifiers that call IRQ holders when an IRQ gets connected? Do we? I was not able to identify such modality. the notifier would be triggered in qemu_allocate_irq right? That would > probably be the cleaner approach here. If it is and if the functionality does not exist yet, I can it, sure. Besides I do not get how VFIO-PCI does handle the problem of late irq binding. If someone can share some knowledge on this, it would be much appreciated. Best Regards Eric > > > Alex >