All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: qemu-devel@nongnu.org
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
	anthony@codemonkey.ws,
	Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>,
	David Gibson <david@gibson.dropbear.id.au>,
	Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH 11/13] iommu: Allow PCI to use IOMMU infrastructure
Date: Tue, 19 Jun 2012 16:39:50 +1000	[thread overview]
Message-ID: <1340087992-2399-12-git-send-email-benh@kernel.crashing.org> (raw)
In-Reply-To: <1340087992-2399-1-git-send-email-benh@kernel.crashing.org>

From: David Gibson <david@gibson.dropbear.id.au>

This patch adds some hooks to let PCI devices and busses use the new IOMMU
infrastructure.  When IOMMU support is enabled, each PCI device now
contains a DMAContext * which is used by the pci_dma_*() wrapper functions.

By default, the contexts are initialized to NULL, assuming no IOMMU.
However the platform or host bridge code which sets up the PCI bus can use
pci_setup_iommu() to set a function which will determine the correct
DMAContext for a given PCI device.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Richard Henderson <rth@twiddle.net>

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 hw/pci.c           |    9 +++++++++
 hw/pci.h           |    9 +++++++--
 hw/pci_internals.h |    2 ++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index bdfb3d6..c8d16a4 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -775,6 +775,9 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
         return NULL;
     }
     pci_dev->bus = bus;
+    if (bus->dma_context_fn) {
+        pci_dev->dma = bus->dma_context_fn(bus, bus->dma_context_opaque, devfn);
+    }
     pci_dev->devfn = devfn;
     pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
     pci_dev->irq_state = 0;
@@ -2021,6 +2024,12 @@ static void pci_device_class_init(ObjectClass *klass, void *data)
     k->props = pci_props;
 }
 
+void pci_setup_iommu(PCIBus *bus, PCIDMAContextFunc fn, void *opaque)
+{
+    bus->dma_context_fn = fn;
+    bus->dma_context_opaque = opaque;
+}
+
 static TypeInfo pci_device_type_info = {
     .name = TYPE_PCI_DEVICE,
     .parent = TYPE_DEVICE,
diff --git a/hw/pci.h b/hw/pci.h
index 99b7e61..c099766 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -179,6 +179,7 @@ typedef void (*MSIVectorReleaseNotifier)(PCIDevice *dev, unsigned int vector);
 
 struct PCIDevice {
     DeviceState qdev;
+
     /* PCI config space */
     uint8_t *config;
 
@@ -200,6 +201,7 @@ struct PCIDevice {
     int32_t devfn;
     char name[64];
     PCIIORegion io_regions[PCI_NUM_REGIONS];
+    DMAContext *dma;
 
     /* do not access the following fields */
     PCIConfigReadFunc *config_read;
@@ -324,6 +326,10 @@ 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);
+
+void pci_setup_iommu(PCIBus *bus, PCIDMAContextFunc fn, void *opaque);
+
 static inline void
 pci_set_byte(uint8_t *config, uint8_t val)
 {
@@ -560,8 +566,7 @@ static inline uint32_t pci_config_size(const PCIDevice *d)
 /* DMA access functions */
 static inline DMAContext *pci_dma_context(PCIDevice *dev)
 {
-    /* Stub for when we have no PCI iommu support */
-    return NULL;
+    return dev->dma;
 }
 
 static inline int pci_dma_rw(PCIDevice *dev, dma_addr_t addr,
diff --git a/hw/pci_internals.h b/hw/pci_internals.h
index 399c6d4..e8bc9f6 100644
--- a/hw/pci_internals.h
+++ b/hw/pci_internals.h
@@ -17,6 +17,8 @@
 
 struct PCIBus {
     BusState qbus;
+    PCIDMAContextFunc dma_context_fn;
+    void *dma_context_opaque;
     uint8_t devfn_min;
     pci_set_irq_fn set_irq;
     pci_map_irq_fn map_irq;
-- 
1.7.9.5

  parent reply	other threads:[~2012-06-19  6:41 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-19  6:39 [Qemu-devel] [PATCH 00/13] iommu series Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 01/13] Better support for dma_addr_t variables Benjamin Herrenschmidt
2012-06-20 21:14   ` Anthony Liguori
2012-06-20 21:29     ` Benjamin Herrenschmidt
2012-06-21  1:44       ` David Gibson
2012-06-20 22:26     ` Peter Maydell
2012-06-20 22:59       ` Anthony Liguori
2012-06-21  7:54         ` Peter Maydell
2012-06-22  1:58     ` Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 02/13] Implement cpu_physical_memory_set() Benjamin Herrenschmidt
2012-06-20 21:15   ` Anthony Liguori
2012-06-20 21:30     ` Benjamin Herrenschmidt
2012-06-20 21:37       ` Anthony Liguori
2012-06-21  1:45     ` David Gibson
2012-06-21  1:46       ` David Gibson
2012-06-21  2:50       ` Benjamin Herrenschmidt
2012-06-22  1:58     ` Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 03/13] iommu: Add universal DMA helper functions Benjamin Herrenschmidt
2012-06-20 21:16   ` Anthony Liguori
2012-06-20 21:32     ` Michael S. Tsirkin
2012-06-20 21:38       ` Anthony Liguori
2012-06-20 21:42         ` Michael S. Tsirkin
2012-06-20 21:46           ` Anthony Liguori
2012-06-20 22:00             ` Michael S. Tsirkin
2012-06-20 21:33     ` Benjamin Herrenschmidt
2012-06-20 21:40     ` Michael S. Tsirkin
2012-06-20 22:01       ` Anthony Liguori
2012-06-21  1:48     ` David Gibson
2012-06-22  2:02     ` Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 04/13] usb-ohci: Use " Benjamin Herrenschmidt
2012-06-20 21:18   ` Anthony Liguori
2012-06-20 21:36     ` Benjamin Herrenschmidt
2012-06-20 21:40       ` Anthony Liguori
2012-06-20 22:02         ` Benjamin Herrenschmidt
2012-06-21  7:33           ` Michael S. Tsirkin
2012-06-21 12:55             ` Anthony Liguori
2012-06-21 14:10               ` Michael S. Tsirkin
2012-06-22  2:28               ` Benjamin Herrenschmidt
2012-06-21  6:43         ` Gerd Hoffmann
2012-06-19  6:39 ` [Qemu-devel] [PATCH 05/13] iommu: Make sglists and dma_bdrv helpers use new universal DMA helpers Benjamin Herrenschmidt
2012-06-20 21:21   ` Anthony Liguori
2012-06-20 21:37     ` Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 06/13] ide/ahci: Use universal DMA helper functions Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 07/13] usb: Convert usb_packet_{map, unmap} to universal DMA helpers Benjamin Herrenschmidt
2012-06-19 13:42   ` Gerd Hoffmann
2012-06-19 20:23     ` Benjamin Herrenschmidt
2012-06-20  3:14       ` David Gibson
2012-06-20  3:52         ` Benjamin Herrenschmidt
2012-06-21  1:42           ` David Gibson
2012-06-20  6:25         ` Gerd Hoffmann
2012-06-20  9:25           ` Benjamin Herrenschmidt
2012-06-20  9:54             ` Gerd Hoffmann
2012-06-19  6:39 ` [Qemu-devel] [PATCH 08/13] iommu: Introduce IOMMU emulation infrastructure Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 09/13] iommu: Add facility to cancel in-use dma memory maps Benjamin Herrenschmidt
2012-06-20 21:25   ` Anthony Liguori
2012-06-20 21:52     ` Benjamin Herrenschmidt
2012-06-22  3:18     ` Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 10/13] pseries: Convert sPAPR TCEs to use generic IOMMU infrastructure Benjamin Herrenschmidt
2012-06-19  6:39 ` Benjamin Herrenschmidt [this message]
2012-06-19  6:39 ` [Qemu-devel] [PATCH 12/13] pseries: Implement IOMMU and DMA for PAPR PCI devices Benjamin Herrenschmidt
2012-06-19  6:39 ` [Qemu-devel] [PATCH 13/13] Add a memory barrier to DMA functions Benjamin Herrenschmidt
2012-06-20 21:12 ` [Qemu-devel] [PATCH 00/13] iommu series Anthony Liguori
  -- strict thread matches above, loose matches on Subject: below --
2012-05-10  4:48 [Qemu-devel] [PATCH 00/13] IOMMU infrastructure Benjamin Herrenschmidt
2012-05-10  4:49 ` [Qemu-devel] [PATCH 11/13] iommu: Allow PCI to use " Benjamin Herrenschmidt

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=1340087992-2399-12-git-send-email-benh@kernel.crashing.org \
    --to=benh@kernel.crashing.org \
    --cc=anthony@codemonkey.ws \
    --cc=david@gibson.dropbear.id.au \
    --cc=eduard.munteanu@linux360.ro \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.