From: "Michael S. Tsirkin" <mst@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: peter.maydell@linaro.org, jan.kiszka@gmail.com,
qemu-devel@nongnu.org, Avi Kivity <avi.kivity@gmail.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [Qemu-devel] [PATCH 27/30] pci: use memory core for iommu support
Date: Fri, 24 May 2013 00:22:58 +0300 [thread overview]
Message-ID: <20130523212257.GE31421@redhat.com> (raw)
In-Reply-To: <1369133851-1894-28-git-send-email-pbonzini@redhat.com>
On Tue, May 21, 2013 at 12:57:28PM +0200, Paolo Bonzini wrote:
> From: Avi Kivity <avi.kivity@gmail.com>
>
> Use the new iommu support in the memory core for iommu support. The only
> user, spapr, is also converted, but it still provides a DMAContext
> interface until the non-PCI bits switch to AddressSpace.
>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Avi Kivity <avi.kivity@gmail.com>
> [ Do not calls memory_region_del_subregion() on the device's
> bus_master_enable_region, it is an alias; return an AddressSpace
> from the IOMMU hook and remove the destructor hook. - David Gibson ]
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Looks good to me.
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> hw/pci/pci.c | 46 ++++++++++++++++++++++-----------------------
> hw/ppc/spapr_pci.c | 9 +++++----
> include/hw/pci-host/spapr.h | 1 +
> include/hw/pci/pci.h | 4 ++--
> include/hw/pci/pci_bus.h | 4 ++--
> 5 files changed, 33 insertions(+), 31 deletions(-)
>
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index c9d585c..9e6bd77 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -279,6 +279,12 @@ int pci_find_domain(const PCIBus *bus)
> return -1;
> }
>
> +static AddressSpace *pci_default_address_space(PCIBus *bus, void *opaque, int devfn)
> +{
> + /* FIXME: inherit memory region from bus creator */
> + return &address_space_memory;
> +}
> +
> static void pci_bus_init(PCIBus *bus, DeviceState *parent,
> const char *name,
> MemoryRegion *address_space_mem,
> @@ -289,6 +295,7 @@ static void pci_bus_init(PCIBus *bus, DeviceState *parent,
> bus->devfn_min = devfn_min;
> bus->address_space_mem = address_space_mem;
> bus->address_space_io = address_space_io;
> + pci_setup_iommu(bus, pci_default_address_space, NULL);
>
> /* host bridge */
> QLIST_INIT(&bus->child);
> @@ -786,6 +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;
> + AddressSpace *dma_as;
>
> if (devfn < 0) {
> for(devfn = bus->devfn_min ; devfn < ARRAY_SIZE(bus->devices);
> @@ -801,21 +809,15 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
> PCI_SLOT(devfn), PCI_FUNC(devfn), name, bus->devices[devfn]->name);
> return NULL;
> }
> +
> pci_dev->bus = bus;
> - if (bus->dma_context_fn) {
> - pci_dev->dma = bus->dma_context_fn(bus, bus->dma_context_opaque, devfn);
> - } else {
> - /* FIXME: Make dma_context_fn use MemoryRegions instead, so this path is
> - * taken unconditionally */
> - /* FIXME: inherit memory region from bus creator */
> - memory_region_init_alias(&pci_dev->bus_master_enable_region, "bus master",
> - get_system_memory(), 0,
> - memory_region_size(get_system_memory()));
> - 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);
> - pci_dev->dma = g_new(DMAContext, 1);
> - dma_context_init(pci_dev->dma, &pci_dev->bus_master_as);
> - }
> + dma_as = bus->iommu_fn(bus, bus->iommu_opaque, devfn);
> + memory_region_init_alias(&pci_dev->bus_master_enable_region, "bus master",
> + 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);
> + pci_dev->dma = g_new(DMAContext, 1);
> + dma_context_init(pci_dev->dma, &pci_dev->bus_master_as);
>
> pci_dev->devfn = devfn;
> pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
> @@ -870,12 +872,10 @@ static void do_pci_unregister_device(PCIDevice *pci_dev)
> pci_dev->bus->devices[pci_dev->devfn] = NULL;
> pci_config_free(pci_dev);
>
> - if (!pci_dev->bus->dma_context_fn) {
> - address_space_destroy(&pci_dev->bus_master_as);
> - memory_region_destroy(&pci_dev->bus_master_enable_region);
> - g_free(pci_dev->dma);
> - pci_dev->dma = NULL;
> - }
> + address_space_destroy(&pci_dev->bus_master_as);
> + memory_region_destroy(&pci_dev->bus_master_enable_region);
> + g_free(pci_dev->dma);
> + pci_dev->dma = NULL;
> }
>
> static void pci_unregister_io_regions(PCIDevice *pci_dev)
> @@ -2232,10 +2232,10 @@ static void pci_device_class_init(ObjectClass *klass, void *data)
> k->props = pci_props;
> }
>
> -void pci_setup_iommu(PCIBus *bus, PCIDMAContextFunc fn, void *opaque)
> +void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque)
> {
> - bus->dma_context_fn = fn;
> - bus->dma_context_opaque = opaque;
> + bus->iommu_fn = fn;
> + bus->iommu_opaque = opaque;
> }
>
> static const TypeInfo pci_device_type_info = {
> diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
> index eb64a8f..762db62 100644
> --- a/hw/ppc/spapr_pci.c
> +++ b/hw/ppc/spapr_pci.c
> @@ -506,12 +506,11 @@ static const MemoryRegionOps spapr_msi_ops = {
> /*
> * PHB PCI device
> */
> -static DMAContext *spapr_pci_dma_context_fn(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_dma(phb->tcet);
> + return &phb->iommu_as;
> }
>
> static int spapr_phb_init(SysBusDevice *s)
> @@ -651,7 +650,9 @@ static int spapr_phb_init(SysBusDevice *s)
> fprintf(stderr, "Unable to create TCE table for %s\n", sphb->dtbusname);
> return -1;
> }
> - pci_setup_iommu(bus, spapr_pci_dma_context_fn, sphb);
> + 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 8d075ab..3a85bce 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -401,9 +401,9 @@ int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
>
> void pci_device_deassert_intx(PCIDevice *dev);
>
> -typedef DMAContext *(*PCIDMAContextFunc)(PCIBus *, void *, int);
> +typedef AddressSpace *(*PCIIOMMUFunc)(PCIBus *, void *, int);
>
> -void pci_setup_iommu(PCIBus *bus, PCIDMAContextFunc fn, void *opaque);
> +void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque);
>
> static inline void
> pci_set_byte(uint8_t *config, uint8_t val)
> diff --git a/include/hw/pci/pci_bus.h b/include/hw/pci/pci_bus.h
> index 6ee443c..66762f6 100644
> --- a/include/hw/pci/pci_bus.h
> +++ b/include/hw/pci/pci_bus.h
> @@ -10,8 +10,8 @@
>
> struct PCIBus {
> BusState qbus;
> - PCIDMAContextFunc dma_context_fn;
> - void *dma_context_opaque;
> + PCIIOMMUFunc iommu_fn;
> + void *iommu_opaque;
> uint8_t devfn_min;
> pci_set_irq_fn set_irq;
> pci_map_irq_fn map_irq;
> --
> 1.8.1.4
>
next prev parent reply other threads:[~2013-05-23 21:22 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-21 10:57 [Qemu-devel] [PATCH 00/30] Introduction of IOMMUs into the memory API Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 01/30] exec: remove obsolete comment Paolo Bonzini
2013-05-21 11:36 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 02/30] exec: eliminate qemu_put_ram_ptr Paolo Bonzini
2013-05-21 11:38 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 03/30] exec: make qemu_get_ram_ptr private Paolo Bonzini
2013-05-21 11:38 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 04/30] exec: eliminate stq_phys_notdirty Paolo Bonzini
2013-05-23 17:32 ` Peter Maydell
2013-05-23 19:18 ` Anthony Liguori
2013-05-23 19:22 ` Paolo Bonzini
2013-05-23 23:14 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 05/30] memory: assert that PhysPageEntry's ptr does not overflow Paolo Bonzini
2013-05-23 17:36 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 06/30] memory: allow memory_region_find() to run on non-root memory regions Paolo Bonzini
2013-05-23 17:52 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 07/30] memory: Replace open-coded memory_region_is_romd Paolo Bonzini
2013-05-21 11:54 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 08/30] memory: Rename readable flag to romd_mode Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 09/30] memory: do not duplicate memory_region_destructor_none Paolo Bonzini
2013-05-21 11:55 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 10/30] memory: make memory_global_sync_dirty_bitmap take an AddressSpace Paolo Bonzini
2013-05-21 11:56 ` Peter Maydell
2013-05-23 1:05 ` David Gibson
2013-05-21 10:57 ` [Qemu-devel] [PATCH 11/30] memory: fix address space initialization/destruction Paolo Bonzini
2013-05-21 11:58 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 12/30] s390x: reduce TARGET_PHYS_ADDR_SPACE_BITS to 62 Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 13/30] memory: limit sections in the radix tree to the actual address space size Paolo Bonzini
2013-05-21 12:02 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 14/30] memory: create FlatView for new address spaces Paolo Bonzini
2013-05-21 12:03 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 15/30] memory: add address_space_valid Paolo Bonzini
2013-05-23 12:05 ` David Gibson
2013-05-23 14:22 ` Jan Kiszka
2013-05-23 14:43 ` Paolo Bonzini
2013-05-23 18:04 ` Peter Maydell
2013-05-24 6:13 ` Jan Kiszka
2013-05-24 10:28 ` Jan Kiszka
2013-05-24 10:50 ` Peter Maydell
2013-05-24 11:02 ` Jan Kiszka
2013-05-24 8:02 ` Paolo Bonzini
2013-05-24 10:52 ` Peter Maydell
2013-05-24 12:58 ` Paolo Bonzini
2013-05-24 13:27 ` Peter Maydell
2013-05-24 13:33 ` Paolo Bonzini
2013-05-24 13:38 ` Peter Maydell
2013-05-25 3:44 ` David Gibson
2013-05-25 9:23 ` Peter Maydell
2013-05-26 13:02 ` David Gibson
2013-05-21 10:57 ` [Qemu-devel] [PATCH 16/30] memory: clean up phys_page_find Paolo Bonzini
2013-05-23 18:06 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 17/30] memory: add address_space_translate Paolo Bonzini
2013-05-23 7:09 ` liu ping fan
2013-05-23 9:59 ` Paolo Bonzini
2013-05-23 13:06 ` liu ping fan
2013-05-23 13:17 ` Paolo Bonzini
2013-05-23 18:15 ` Peter Maydell
2013-05-25 6:40 ` Jan Kiszka
2013-05-25 7:47 ` Paolo Bonzini
2013-05-25 10:19 ` Jan Kiszka
2013-05-25 11:20 ` Paolo Bonzini
2013-05-25 11:30 ` Jan Kiszka
2013-05-26 8:56 ` Paolo Bonzini
2013-05-26 9:02 ` Jan Kiszka
2013-05-27 7:20 ` Paolo Bonzini
2013-05-27 7:23 ` Jan Kiszka
2013-05-27 8:19 ` Paolo Bonzini
2013-05-27 8:37 ` Jan Kiszka
2013-05-27 10:33 ` Peter Maydell
2013-05-27 10:45 ` Paolo Bonzini
2013-05-27 11:33 ` Peter Maydell
2013-05-26 9:01 ` Paolo Bonzini
2013-05-26 9:12 ` Jan Kiszka
2013-05-26 18:23 ` Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 18/30] memory: add return value to address_space_rw/read/write Paolo Bonzini
2013-05-23 18:18 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 19/30] memory: Introduce address_space_lookup_region Paolo Bonzini
2013-05-23 18:19 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 20/30] memory: iommu support Paolo Bonzini
2013-05-23 18:24 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 21/30] memory: Add iommu map/unmap notifiers Paolo Bonzini
2013-05-23 18:27 ` Peter Maydell
2013-05-23 19:24 ` Paolo Bonzini
2013-05-29 4:08 ` David Gibson
2013-05-21 10:57 ` [Qemu-devel] [PATCH 22/30] vfio: abort if an emulated iommu is used Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 23/30] spapr: convert TCE API to use an opaque type Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 24/30] spapr: make IOMMU translation go through IOMMUTLBEntry Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 25/30] spapr: use memory core for iommu support Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 26/30] dma: eliminate old-style IOMMU support Paolo Bonzini
2013-05-23 18:31 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 27/30] pci: use memory core for iommu support Paolo Bonzini
2013-05-23 18:36 ` Peter Maydell
2013-05-23 21:22 ` Michael S. Tsirkin [this message]
2013-05-21 10:57 ` [Qemu-devel] [PATCH 28/30] spapr_vio: take care of creating our own AddressSpace/DMAContext Paolo Bonzini
2013-05-21 10:57 ` [Qemu-devel] [PATCH 29/30] dma: eliminate DMAContext Paolo Bonzini
2013-05-23 18:40 ` Peter Maydell
2013-05-21 10:57 ` [Qemu-devel] [PATCH 30/30] memory: give name to every AddressSpace Paolo Bonzini
2013-05-23 18:46 ` Peter Maydell
2013-05-22 2:30 ` [Qemu-devel] [PATCH 00/30] Introduction of IOMMUs into the memory API Alexey Kardashevskiy
2013-05-22 9:24 ` Paolo Bonzini
2013-05-23 17:08 ` Paolo Bonzini
2013-05-23 17:25 ` Peter Maydell
2013-05-23 17:30 ` Paolo Bonzini
2013-05-23 18:47 ` Peter Maydell
2013-05-24 14:12 ` Alexey Kardashevskiy
2013-05-24 14:20 ` 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=20130523212257.GE31421@redhat.com \
--to=mst@redhat.com \
--cc=avi.kivity@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=jan.kiszka@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@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).