1. 29 Jun, 2012 12 commits
  2. 28 Jun, 2012 18 commits
  3. 27 Jun, 2012 10 commits
    • Benjamin Herrenschmidt's avatar
      Add a memory barrier to DMA functions · 7a0bac4d
      Benjamin Herrenschmidt authored
      The emulated devices can run simultaneously with the guest, so
      we need to be careful with ordering of load and stores done by
      them to the guest system memory, which need to be observed in
      the right order by the guest operating system.
      
      This adds a barrier call to the basic DMA read/write ops which
      is currently implemented as a smp_mb(), but could be later
      improved for more fine grained control of barriers.
      
      Additionally, a _relaxed() variant of the accessors is provided
      to easily convert devices who would be performance sensitive
      and negatively impacted by the change.
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      7a0bac4d
    • David Gibson's avatar
      pseries: Implement IOMMU and DMA for PAPR PCI devices · edded454
      David Gibson authored
      Currently the pseries machine emulation does not support DMA for emulated
      PCI devices, because the PAPR spec always requires a (guest visible,
      paravirtualized) IOMMU which was not implemented.  Now that we have
      infrastructure for IOMMU emulation, we can correct this and allow PCI DMA
      for pseries.
      
      With the existing PAPR IOMMU code used for VIO devices, this is almost
      trivial. We use a single DMAContext for each (virtual) PCI host bridge,
      which is the usual configuration on real PAPR machines (which often have
      _many_ PCI host bridges).
      
      Cc: Alex Graf <agraf@suse.de>
      Signed-off-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
      Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      edded454
    • David Gibson's avatar
      iommu: Allow PCI to use IOMMU infrastructure · 5fa45de5
      David Gibson authored
      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: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarEduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      5fa45de5
    • David Gibson's avatar
      pseries: Convert sPAPR TCEs to use generic IOMMU infrastructure · ad0ebb91
      David Gibson authored
      The pseries platform already contains an IOMMU implementation, since it is
      essential for the platform's paravirtualized VIO devices.  This IOMMU
      support is currently built into the implementation of the VIO "bus" and
      the various VIO devices.
      
      This patch converts this code to make use of the new common IOMMU
      infrastructure.
      
      We don't yet handle synchronization of map/unmap callbacks vs. invalidations,
      this will require some complex interaction with the kernel and is not a
      major concern at this stage.
      
      Cc: Alex Graf <agraf@suse.de>
      Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      ad0ebb91
    • David Gibson's avatar
      iommu: Introduce IOMMU emulation infrastructure · e5332e63
      David Gibson authored
      This patch adds the basic infrastructure necessary to emulate an IOMMU
      visible to the guest.  The DMAContext structure is extended with
      information and a callback describing the translation, and the various
      DMA functions used by devices will now perform IOMMU translation using
      this callback.
      
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Cc: Richard Henderson <rth@twiddle.net>
      Signed-off-by: default avatarEduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
      Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      e5332e63
    • David Gibson's avatar
      usb: Convert usb_packet_{map, unmap} to universal DMA helpers · e2f89926
      David Gibson authored
      The USB UHCI and EHCI drivers were converted some time ago to use the
      pci_dma_*() helper functions.  However, this conversion was not complete
      because in some places both these drivers do DMA via the usb_packet_map()
      function in usb-libhw.c.  That function directly used
      cpu_physical_memory_map().
      
      Now that the sglist code uses DMA wrappers properly, we can convert the
      functions in usb-libhw.c, thus conpleting the conversion of UHCI and EHCI
      to use the DMA wrappers.
      
      Note that usb_packet_map() invokes dma_memory_map() with a NULL invalidate
      callback function.  When IOMMU support is added, this will mean that
      usb_packet_map() and the corresponding usb_packet_unmap() must be called in
      close proximity without dropping the qemu device lock - otherwise the guest
      might invalidate IOMMU mappings while they are still in use by the device
      code.
      Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      e2f89926
    • David Gibson's avatar
      ide/ahci: Use universal DMA helper functions · 10ca2943
      David Gibson authored
      The AHCI device can provide both PCI and SysBus AHCI device
      emulations.  For this reason, it wasn't previously converted to use
      the pci_dma_*() helper functions.  Now that we have universal DMA
      helper functions, this converts AHCI to use them.
      
      The DMAContext is obtained from pci_dma_context() in the PCI case and
      set to NULL in the SysBus case (i.e. we assume for now that a SysBus
      AHCI has no IOMMU translation).
      
      Cc: Kevin Wolf <kwolf@redhat.com>
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      10ca2943
    • David Gibson's avatar
      iommu: Make sglists and dma_bdrv helpers use new universal DMA helpers · c65bcef3
      David Gibson authored
      dma-helpers.c contains a number of helper functions for doing
      scatter/gather DMA, and various block device related DMA.  Currently,
      these directly access guest memory using cpu_physical_memory_*(),
      assuming no IOMMU translation.
      
      This patch updates this code to use the new universal DMA helper
      functions.  qemu_sglist_init() now takes a DMAContext * to describe
      the DMA address space in which the scatter/gather will take place.
      
      We minimally update the callers qemu_sglist_init() to pass NULL
      (i.e. no translation, same as current behaviour).  Some of those
      callers should pass something else in some cases to allow proper IOMMU
      translation in future, but that will be fixed in later patches.
      
      Cc: Kevin Wolf <kwolf@redhat.com>
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      c65bcef3
    • David Gibson's avatar
      usb-ohci: Use universal DMA helper functions · 9ac6a217
      David Gibson authored
      The OHCI device emulation can provide both PCI and SysBus OHCI
      implementations.  Because of this, it was not previously converted to
      use the PCI DMA helper functions.
      
      This patch converts it to use the new universal DMA helper functions.
      In the PCI case, it obtains its DMAContext from pci_dma_context(), in
      the SysBus case, it uses NULL - i.e. assumes for now that there will
      be no IOMMU translation for a SysBus OHCI.
      
      Cc: Gerd Hoffmann <kraxel@redhat.com>
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      9ac6a217
    • David Gibson's avatar
      iommu: Add universal DMA helper functions · d86a77f8
      David Gibson authored
      Not that long ago, every device implementation using DMA directly
      accessed guest memory using cpu_physical_memory_*().  This meant that
      adding support for a guest visible IOMMU would require changing every
      one of these devices to go through IOMMU translation.
      
      Shortly before qemu 1.0, I made a start on fixing this by providing
      helper functions for PCI DMA.  These are currently just stubs which
      call the direct access functions, but mean that an IOMMU can be
      implemented in one place, rather than for every PCI device.
      
      Clearly, this doesn't help for non PCI devices, which could also be
      IOMMU translated on some platforms.  It is also problematic for the
      devices which have both PCI and non-PCI version (e.g. OHCI, AHCI) - we
      cannot use the the pci_dma_*() functions, because they assume the
      presence of a PCIDevice, but we don't want to have to check between
      pci_dma_*() and cpu_physical_memory_*() every time we do a DMA in the
      device code.
      
      This patch makes the first step on addressing both these problems, by
      introducing new (stub) dma helper functions which can be used for any
      DMA capable device.
      
      These dma functions take a DMAContext *, a new (currently empty)
      variable describing the DMA address space in which the operation is to
      take place.  NULL indicates untranslated DMA directly into guest
      physical address space.  The intention is that in future non-NULL
      values will given information about any necessary IOMMU translation.
      
      DMA using devices must obtain a DMAContext (or, potentially, contexts)
      from their bus or platform.  For now this patch just converts the PCI
      wrappers to be implemented in terms of the universal wrappers,
      converting other drivers can take place over time.
      
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Cc: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
      Cc: Richard Henderson <rth@twiddle.net>
      Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
      d86a77f8