qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: alex.williamson@redhat.com, pbonzini@redhat.com
Cc: aik@ozlabs.ru, David Gibson <david@gibson.dropbear.id.au>,
	qemu-ppc@nongnu.org, qemu-devel@nongnu.org, mst@redhat.com
Subject: [Qemu-devel] [PATCH 04/11] pci: Use AddressSpace rather than MemoryRegion to represent PCI DMA space
Date: Tue, 14 May 2013 19:13:50 +1000	[thread overview]
Message-ID: <1368522837-20747-5-git-send-email-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <1368522837-20747-1-git-send-email-david@gibson.dropbear.id.au>

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 <david@gibson.dropbear.id.au>
---
 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);
 
-- 
1.7.10.4

  parent reply	other threads:[~2013-05-14  9:14 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-14  9:13 [Qemu-devel] [0/11] RFC: VFIO and guest side IOMMUs, version 3 David Gibson
2013-05-14  9:13 ` [Qemu-devel] [PATCH 01/11] iommu: Fix compile error in ioapic.c David Gibson
2013-05-14  9:13 ` [Qemu-devel] [PATCH 02/11] pci: Don't del_subgregion on a non subregion David Gibson
2013-05-14  9:13 ` [Qemu-devel] [PATCH 03/11] pci: Rework PCI iommu lifetime assumptions David Gibson
2013-05-14  9:13 ` David Gibson [this message]
2013-05-14  9:13 ` [Qemu-devel] [PATCH 05/11] pci: Introduce helper to retrieve a PCI device's DMA address space David Gibson
2013-05-14  9:13 ` [Qemu-devel] [PATCH 06/11] memory: Sanity check that no listeners remain on a destroyed AddressSpace David Gibson
2013-05-14  9:13 ` [Qemu-devel] [PATCH 07/11] vfio: Introduce VFIO address spaces David Gibson
2013-05-14 16:53   ` Alex Williamson
2013-05-15  1:18     ` [Qemu-devel] [Qemu-ppc] " David Gibson
2013-05-14  9:13 ` [Qemu-devel] [PATCH 08/11] vfio: Create VFIOAddressSpace objects as needed David Gibson
2013-05-14  9:13 ` [Qemu-devel] [PATCH 09/11] memory: Add iova to IOMMUTLBEntry David Gibson
2013-05-14 16:53   ` Alex Williamson
2013-05-15  3:51     ` [Qemu-devel] [Qemu-ppc] " David Gibson
2013-05-14 21:22   ` [Qemu-devel] " Paolo Bonzini
2013-05-14  9:13 ` [Qemu-devel] [PATCH 10/11] memory: Add iommu map/unmap notifiers David Gibson
2013-05-14 17:15   ` Alex Williamson
2013-05-14 21:02     ` Paolo Bonzini
2013-05-14 21:23   ` Paolo Bonzini
2013-05-15  1:21     ` [Qemu-devel] [Qemu-ppc] " David Gibson
2013-05-14  9:13 ` [Qemu-devel] [PATCH 11/11] vfio: Add guest side IOMMU support David Gibson
2013-05-14  9:48   ` Paolo Bonzini
2013-05-14 13:57     ` [Qemu-devel] [Qemu-ppc] " David Gibson
2013-05-14 17:15   ` [Qemu-devel] " Alex Williamson
2013-05-15  1:33     ` [Qemu-devel] [Qemu-ppc] " David Gibson
2013-05-15  2:51       ` Alex Williamson
2013-05-15  3:32         ` David Gibson
2013-05-16  6:53           ` David Gibson
2013-05-14  9:39 ` [Qemu-devel] [0/11] RFC: VFIO and guest side IOMMUs, version 3 Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1368522837-20747-5-git-send-email-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=aik@ozlabs.ru \
    --cc=alex.williamson@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).