From mboxrd@z Thu Jan 1 00:00:00 1970 From: frank.blaschka@de.ibm.com Subject: [RFC patch 6/6] vfio: make vfio run on s390 platform Date: Fri, 19 Sep 2014 13:54:35 +0200 Message-ID: <20140919115940.596533004@de.ibm.com> References: <20140919115429.557279920@de.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Return-path: Content-Disposition: inline; filename=104-qemu_vfio.patch Sender: kvm-owner@vger.kernel.org List-Archive: List-Post: To: qemu-devel@nongnu.org, linux-s390@vger.kernel.org, kvm@vger.kernel.org Cc: alex.williamson@redhat.com, pbonzini@redhat.com, agraf@suse.de List-ID: From: Frank Blaschka Following changes are made because of platform differences: 1) s390 does not support mmap'ing of PCI BARs so we have to go via slow path 2) no intx support 3) no classic MSIX interrupts. The pci hw understands the concept of requesting MSIX irqs but irqs are delivered as s390 adapter irqs. Introduce s390 specific functions for msix notification (slow path) and msi routes (kvm fast path). 4) Use type1 iommu but register only for iommu address space Signed-off-by: Frank Blaschka --- hw/misc/vfio.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) --- a/hw/misc/vfio.c +++ b/hw/misc/vfio.c @@ -40,6 +40,9 @@ #include "sysemu/kvm.h" #include "sysemu/sysemu.h" #include "hw/misc/vfio.h" +#ifdef TARGET_S390X +#include "hw/s390x/s390-pci-bus.h" +#endif /* #define DEBUG_VFIO */ #ifdef DEBUG_VFIO @@ -51,7 +54,11 @@ #endif /* Extra debugging, trap acceleration paths for more logging */ +#ifdef TARGET_S390X +#define VFIO_ALLOW_MMAP 0 +#else #define VFIO_ALLOW_MMAP 1 +#endif #define VFIO_ALLOW_KVM_INTX 1 #define VFIO_ALLOW_KVM_MSI 1 #define VFIO_ALLOW_KVM_MSIX 1 @@ -554,6 +561,10 @@ static int vfio_enable_intx(VFIODevice * struct vfio_irq_set *irq_set; int32_t *pfd; +#ifdef TARGET_S390X + return 0; +#endif + if (!pin) { return 0; } @@ -664,7 +675,11 @@ static void vfio_msi_interrupt(void *opa #endif if (vdev->interrupt == VFIO_INT_MSIX) { +#ifdef TARGET_S390X + s390_msix_notify(&vdev->pdev, nr); +#else msix_notify(&vdev->pdev, nr); +#endif } else if (vdev->interrupt == VFIO_INT_MSI) { msi_notify(&vdev->pdev, nr); } else { @@ -730,7 +745,11 @@ static void vfio_add_kvm_msi_virq(VFIOMS return; } +#ifdef TARGET_S390X + virq = s390_irqchip_add_msi_route(&vector->vdev->pdev, kvm_state, *msg); +#else virq = kvm_irqchip_add_msi_route(kvm_state, *msg); +#endif if (virq < 0) { event_notifier_cleanup(&vector->kvm_interrupt); return; @@ -3702,8 +3721,13 @@ static int vfio_connect_container(VFIOGr container->iommu_data.type1.listener = vfio_memory_listener; container->iommu_data.release = vfio_listener_release; +#ifdef TARGET_S390X + memory_listener_register(&container->iommu_data.type1.listener, + container->space->as); +#else memory_listener_register(&container->iommu_data.type1.listener, &address_space_memory); +#endif if (container->iommu_data.type1.error) { ret = container->iommu_data.type1.error; From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41540) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XUwr4-0001CY-FX for qemu-devel@nongnu.org; Fri, 19 Sep 2014 08:00:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XUwqs-0008Up-LV for qemu-devel@nongnu.org; Fri, 19 Sep 2014 08:00:02 -0400 Received: from e06smtp13.uk.ibm.com ([195.75.94.109]:60841) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XUwqs-0008UE-DZ for qemu-devel@nongnu.org; Fri, 19 Sep 2014 07:59:50 -0400 Received: from /spool/local by e06smtp13.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 19 Sep 2014 12:59:44 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by d06dlp01.portsmouth.uk.ibm.com (Postfix) with ESMTP id 7BF1817D805D for ; Fri, 19 Sep 2014 13:01:46 +0100 (BST) Received: from d06av03.portsmouth.uk.ibm.com (d06av03.portsmouth.uk.ibm.com [9.149.37.213]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id s8JBxfMx46203010 for ; Fri, 19 Sep 2014 11:59:41 GMT Received: from d06av03.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av03.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s8JBxeDE016188 for ; Fri, 19 Sep 2014 05:59:41 -0600 Message-Id: <20140919115940.596533004@de.ibm.com> Date: Fri, 19 Sep 2014 13:54:35 +0200 From: frank.blaschka@de.ibm.com References: <20140919115429.557279920@de.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline; filename=104-qemu_vfio.patch Subject: [Qemu-devel] [RFC patch 6/6] vfio: make vfio run on s390 platform List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, linux-s390@vger.kernel.org, kvm@vger.kernel.org Cc: pbonzini@redhat.com, alex.williamson@redhat.com, agraf@suse.de From: Frank Blaschka Following changes are made because of platform differences: 1) s390 does not support mmap'ing of PCI BARs so we have to go via slow path 2) no intx support 3) no classic MSIX interrupts. The pci hw understands the concept of requesting MSIX irqs but irqs are delivered as s390 adapter irqs. Introduce s390 specific functions for msix notification (slow path) and msi routes (kvm fast path). 4) Use type1 iommu but register only for iommu address space Signed-off-by: Frank Blaschka --- hw/misc/vfio.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) --- a/hw/misc/vfio.c +++ b/hw/misc/vfio.c @@ -40,6 +40,9 @@ #include "sysemu/kvm.h" #include "sysemu/sysemu.h" #include "hw/misc/vfio.h" +#ifdef TARGET_S390X +#include "hw/s390x/s390-pci-bus.h" +#endif /* #define DEBUG_VFIO */ #ifdef DEBUG_VFIO @@ -51,7 +54,11 @@ #endif /* Extra debugging, trap acceleration paths for more logging */ +#ifdef TARGET_S390X +#define VFIO_ALLOW_MMAP 0 +#else #define VFIO_ALLOW_MMAP 1 +#endif #define VFIO_ALLOW_KVM_INTX 1 #define VFIO_ALLOW_KVM_MSI 1 #define VFIO_ALLOW_KVM_MSIX 1 @@ -554,6 +561,10 @@ static int vfio_enable_intx(VFIODevice * struct vfio_irq_set *irq_set; int32_t *pfd; +#ifdef TARGET_S390X + return 0; +#endif + if (!pin) { return 0; } @@ -664,7 +675,11 @@ static void vfio_msi_interrupt(void *opa #endif if (vdev->interrupt == VFIO_INT_MSIX) { +#ifdef TARGET_S390X + s390_msix_notify(&vdev->pdev, nr); +#else msix_notify(&vdev->pdev, nr); +#endif } else if (vdev->interrupt == VFIO_INT_MSI) { msi_notify(&vdev->pdev, nr); } else { @@ -730,7 +745,11 @@ static void vfio_add_kvm_msi_virq(VFIOMS return; } +#ifdef TARGET_S390X + virq = s390_irqchip_add_msi_route(&vector->vdev->pdev, kvm_state, *msg); +#else virq = kvm_irqchip_add_msi_route(kvm_state, *msg); +#endif if (virq < 0) { event_notifier_cleanup(&vector->kvm_interrupt); return; @@ -3702,8 +3721,13 @@ static int vfio_connect_container(VFIOGr container->iommu_data.type1.listener = vfio_memory_listener; container->iommu_data.release = vfio_listener_release; +#ifdef TARGET_S390X + memory_listener_register(&container->iommu_data.type1.listener, + container->space->as); +#else memory_listener_register(&container->iommu_data.type1.listener, &address_space_memory); +#endif if (container->iommu_data.type1.error) { ret = container->iommu_data.type1.error;