From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50941) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZcYw2-0003Hu-OF for qemu-devel@nongnu.org; Thu, 17 Sep 2015 09:09:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZcYvw-00065l-0g for qemu-devel@nongnu.org; Thu, 17 Sep 2015 09:09:10 -0400 From: David Gibson Date: Thu, 17 Sep 2015 23:09:17 +1000 Message-Id: <1442495357-26547-11-git-send-email-david@gibson.dropbear.id.au> In-Reply-To: <1442495357-26547-1-git-send-email-david@gibson.dropbear.id.au> References: <1442495357-26547-1-git-send-email-david@gibson.dropbear.id.au> Subject: [Qemu-devel] [RFC PATCH 10/10] spapr_pci: Allow VFIO devices to work on the normal PCI host bridge List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: alex.williamson@redhat.com, aik@ozlabs.ru, gwshan@linux.vnet.ibm.com Cc: lvivier@redhat.com, thuth@redhat.com, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, pbonzini@redhat.com, David Gibson The core VFIO infrastructure more or less allows VFIO devices to work on any normal guest PCI host bridge (PHB) without extra logic. However, the "spapr-pci-host-bridge" device (as opposed to the special "spapr-pci-vfio-host-bridge" device) breaks this by using a partially KVM accelerated implementation of the guest kernel IOMMU which won't work with VFIO devices, without additional kernel support. This patch allows VFIO devices to work on the spapr-pci-host-bridge, by having it switch off KVM TCE acceleration when a VFIO device is added to the PHB (either on startup, or by hotplug). Signed-off-by: David Gibson --- hw/ppc/spapr_pci.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 622c4ac..a0cca22 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -1090,6 +1090,12 @@ static void spapr_phb_add_pci_device(sPAPRDRConnector *drc, void *fdt = NULL; int fdt_start_offset = 0, fdt_size; + if (object_dynamic_cast(OBJECT(pdev), "vfio-pci")) { + sPAPRTCETable *tcet = spapr_tce_find_by_liobn(phb->dma_liobn); + + spapr_tce_need_vfio(tcet); + } + if (dev->hotplugged) { fdt = create_device_tree(&fdt_size); fdt_start_offset = spapr_create_pci_child_dt(phb, pdev, fdt, 0); -- 2.4.3