From patchwork Mon May 13 10:54:21 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 243362 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 788842C008C for ; Mon, 13 May 2013 20:55:41 +1000 (EST) Received: from localhost ([::1]:38398 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UbqPr-0007Jy-4i for incoming@patchwork.ozlabs.org; Mon, 13 May 2013 06:55:39 -0400 Received: from eggs.gnu.org ([208.118.235.92]:51639) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UbqOt-0006Zg-99 for qemu-devel@nongnu.org; Mon, 13 May 2013 06:54:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UbqOo-0000Uu-Og for qemu-devel@nongnu.org; Mon, 13 May 2013 06:54:39 -0400 Received: from ozlabs.org ([203.10.76.45]:48782) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UbqOo-0000UY-4k for qemu-devel@nongnu.org; Mon, 13 May 2013 06:54:34 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 1ADAB2C00A8; Mon, 13 May 2013 20:54:30 +1000 (EST) From: David Gibson To: alex.williamson@redhat.com, pbonzini@redhat.com Date: Mon, 13 May 2013 20:54:21 +1000 Message-Id: <1368442465-14363-5-git-send-email-david@gibson.dropbear.id.au> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1368442465-14363-1-git-send-email-david@gibson.dropbear.id.au> References: <1368442465-14363-1-git-send-email-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 203.10.76.45 Cc: aik@ozlabs.ru, qemu-devel@nongnu.org, David Gibson , agraf@suse.de, mst@redhat.com Subject: [Qemu-devel] [PATCH 4/8] pci: Use AddressSpace rather than MemoryRegion to represent PCI DMA space X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Currently the PCI iommu_fn hook returns a MemoryRegion * to represent the DMA address of this bus's IOMMU, although that MemoryRegion does have to be a root MemoryRegion. Several upcoming users of this need the extra features of an AddressSpace object, rather than a MemoryRegion, and while they could each construct their own AddressSpace wrapper for the iommu MemoryRegion, that leads to unnecessary proliferation of essentially identical AddressSpace objects. This patch avoids that, by instead having iommu_fn return an AddressSpace *, assuming the referenced AS's lifetime is managed somewhere else (probably the PCI host bridge). Signed-off-by: David Gibson --- hw/pci/pci.c | 10 +++++----- hw/ppc/spapr_pci.c | 6 ++++-- include/hw/pci-host/spapr.h | 1 + include/hw/pci/pci.h | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 3c947b3..39085d8 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -279,10 +279,10 @@ int pci_find_domain(const PCIBus *bus) return -1; } -static MemoryRegion *pci_default_iommu(PCIBus *bus, void *opaque, int devfn) +static AddressSpace *pci_default_iommu(PCIBus *bus, void *opaque, int devfn) { /* FIXME: inherit memory region from bus creator */ - return get_system_memory(); + return &address_space_memory; } static void pci_bus_init(PCIBus *bus, DeviceState *parent, @@ -793,7 +793,7 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev); PCIConfigReadFunc *config_read = pc->config_read; PCIConfigWriteFunc *config_write = pc->config_write; - MemoryRegion *dma_mr; + AddressSpace *dma_as; if (devfn < 0) { for(devfn = bus->devfn_min ; devfn < ARRAY_SIZE(bus->devices); @@ -811,9 +811,9 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus, } pci_dev->bus = bus; - dma_mr = bus->iommu_fn(bus, bus->iommu_opaque, devfn); + dma_as = bus->iommu_fn(bus, bus->iommu_opaque, devfn); memory_region_init_alias(&pci_dev->bus_master_enable_region, "bus master", - dma_mr, 0, memory_region_size(dma_mr)); + dma_as->root, 0, memory_region_size(dma_as->root)); memory_region_set_enabled(&pci_dev->bus_master_enable_region, false); address_space_init(&pci_dev->bus_master_as, &pci_dev->bus_master_enable_region, name); diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index eb1d9e7..762db62 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -506,11 +506,11 @@ static const MemoryRegionOps spapr_msi_ops = { /* * PHB PCI device */ -static MemoryRegion *spapr_pci_dma_iommu(PCIBus *bus, void *opaque, int devfn) +static AddressSpace *spapr_pci_dma_iommu(PCIBus *bus, void *opaque, int devfn) { sPAPRPHBState *phb = opaque; - return spapr_tce_get_iommu(phb->tcet); + return &phb->iommu_as; } static int spapr_phb_init(SysBusDevice *s) @@ -650,6 +650,8 @@ static int spapr_phb_init(SysBusDevice *s) fprintf(stderr, "Unable to create TCE table for %s\n", sphb->dtbusname); return -1; } + address_space_init(&sphb->iommu_as, spapr_tce_get_iommu(sphb->tcet), + sphb->dtbusname); pci_setup_iommu(bus, spapr_pci_dma_iommu, sphb); QLIST_INSERT_HEAD(&spapr->phbs, sphb, list); diff --git a/include/hw/pci-host/spapr.h b/include/hw/pci-host/spapr.h index 653dd40..1e23dbf 100644 --- a/include/hw/pci-host/spapr.h +++ b/include/hw/pci-host/spapr.h @@ -50,6 +50,7 @@ typedef struct sPAPRPHBState { uint64_t dma_window_start; uint64_t dma_window_size; sPAPRTCETable *tcet; + AddressSpace iommu_as; struct { uint32_t irq; diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index 61fe51e..6ef1f97 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -400,7 +400,7 @@ int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp, void pci_device_deassert_intx(PCIDevice *dev); -typedef MemoryRegion *(*PCIIOMMUFunc)(PCIBus *, void *, int); +typedef AddressSpace *(*PCIIOMMUFunc)(PCIBus *, void *, int); void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque);