1. 12 11月, 2009 1 次提交
    • A
      intel-iommu: Obey coherent_dma_mask for alloc_coherent on passthrough · e8bb910d
      Alex Williamson 提交于
      The model for IOMMU passthrough is that decent devices that can cope
      with DMA to all of memory get passthrough; crappy devices with a limited
      dma_mask don't -- they get to use the IOMMU anyway.
      
      This is done on the basis that IOMMU passthrough is usually wanted for
      performance reasons, and it's only the decent PCI devices that you
      really care about performance for, while the crappy 32-bit ones like
      your USB controller can just use the IOMMU and you won't really care.
      
      Unfortunately, the check for this was only looking at dev->dma_mask, not
      at dev->coherent_dma_mask. And some devices have a 32-bit
      coherent_dma_mask even though they have a full 64-bit dma_mask.
      
      Even more unfortunately, fixing that simple oversight would upset
      certain broken HP devices. Not only do they have a 32-bit
      coherent_dma_mask, but they also have a tendency to do stray DMA to
      unmapped addresses. And then they die when they take the DMA fault they
      so richly deserve.
      
      So if we do the 'correct' fix, it'll mean that affected users have to
      disable IOMMU support completely on "a large percentage of servers from
      a major vendor."
      
      Personally, I have little sympathy -- given that this is the _same_
      'major vendor' who is shipping machines which claim to have IOMMU
      support but have obviously never _once_ booted a VT-d capable OS to do
      any form of QA. But strictly speaking, it _would_ be a regression even
      though it only ever worked by fluke.
      
      For 2.6.33, we'll come up with a quirk which gives swiotlb support
      for this particular device, and other devices with an inadequate
      coherent_dma_mask will just get normal IOMMU mapping.
      
      The simplest fix for 2.6.32, though, is just to jump through some hoops
      to try to allocate coherent DMA memory for such devices in a place that
      they can reach. We'd use dma_generic_alloc_coherent() for this if it
      existed on IA64.
      Signed-off-by: NAlex Williamson <alex.williamson@hp.com>
      Signed-off-by: NDavid Woodhouse <David.Woodhouse@intel.com>
      e8bb910d
  2. 01 10月, 2009 1 次提交
  3. 20 9月, 2009 2 次提交
  4. 19 9月, 2009 2 次提交
  5. 02 9月, 2009 1 次提交
  6. 31 8月, 2009 1 次提交
  7. 26 8月, 2009 1 次提交
  8. 24 8月, 2009 2 次提交
    • D
      intel-iommu: iommu init error path bug fixes · 94a91b50
      Donald Dutile 提交于
      The kcalloc() failure path in iommu_init_domains() calls
      free_dmar_iommu(), which assumes that ->domains, ->domain_ids,
      and ->lock have been properly initialized.
      
      Add checks in free_[dmar]_iommu to not use ->domains,->domain_ids
      if not alloced. Move the lock init to prior to the kcalloc()'s,
      so it is valid in free_context_table() when free_dmar_iommu() invokes
      it at the end.
      
      Patch based on iommu-2.6,
      commit 13203227Signed-off-by: NDonald Dutile <ddutile@redhat.com>
      Signed-off-by: NDavid Woodhouse <David.Woodhouse@intel.com>
      94a91b50
    • M
      intel-iommu: Mark functions with __init · 071e1374
      Matt Kraai 提交于
      Mark si_domain_init and iommu_prepare_static_identity_mapping with
      __init, to eliminate the following warnings:
      
      WARNING: drivers/pci/built-in.o(.text+0xf1f4): Section mismatch in reference from the function si_domain_init() to the function .init.text:si_domain_work_fn()
      The function si_domain_init() references
      the function __init si_domain_work_fn().
      This is often because si_domain_init lacks a __init
      annotation or the annotation of si_domain_work_fn is wrong.
      
      WARNING: drivers/pci/built-in.o(.text+0xe340): Section mismatch in reference from the function iommu_prepare_static_identity_mapping() to the function .init.text:si_domain_init()
      The function iommu_prepare_static_identity_mapping() references
      the function __init si_domain_init().
      This is often because iommu_prepare_static_identity_mapping lacks a __init
      annotation or the annotation of si_domain_init is wrong.
      Signed-off-by: NMatt Kraai <kraai@ftbfs.org>
      Signed-off-by: NDavid Woodhouse <David.Woodhouse@intel.com>
      071e1374
  9. 09 8月, 2009 1 次提交
  10. 06 8月, 2009 1 次提交
  11. 05 8月, 2009 2 次提交
  12. 04 8月, 2009 1 次提交
    • D
      intel-iommu: Unify hardware and software passthrough support · 19943b0e
      David Woodhouse 提交于
      This makes the hardware passthrough mode work a lot more like the
      software version, so that the behaviour of a kernel with 'iommu=pt'
      is the same whether the hardware supports passthrough or not.
      
      In particular:
       - We use a single si_domain for the pass-through devices.
       - 32-bit devices can be taken out of the pass-through domain so that
         they don't have to use swiotlb.
       - Devices will work again after being removed from a KVM guest.
       - A potential oops on OOM (in init_context_pass_through()) is fixed.
      Signed-off-by: NDavid Woodhouse <David.Woodhouse@intel.com>
      19943b0e
  13. 22 7月, 2009 1 次提交
    • J
      intel_txt: Force IOMMU on for Intel TXT launch · a59b50e9
      Joseph Cihula 提交于
      The tboot module will DMA protect all of memory in order to ensure the that
      kernel will be able to initialize without compromise (from DMA).  Consequently,
      the kernel must enable Intel Virtualization Technology for Directed I/O
      (VT-d or Intel IOMMU) in order to replace this broad protection with the
      appropriate page-granular protection.  Otherwise DMA devices will be unable
      to read or write from memory and the kernel will eventually panic.
      
      Because runtime IOMMU support is configurable by command line options, this
      patch will force it to be enabled regardless of the options specified, and will
      log a message if it was required to force it on.
      
       dmar.c        |    7 +++++++
       intel-iommu.c |   17 +++++++++++++++--
       2 files changed, 22 insertions(+), 2 deletions(-)
      Signed-off-by: NJoseph Cihula <joseph.cihula@intel.com>
      Signed-off-by: NShane Wang <shane.wang@intel.com>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: NH. Peter Anvin <hpa@zytor.com>
      a59b50e9
  14. 20 7月, 2009 1 次提交
  15. 15 7月, 2009 3 次提交
  16. 09 7月, 2009 1 次提交
  17. 08 7月, 2009 1 次提交
  18. 05 7月, 2009 2 次提交
    • D
      intel-iommu: Don't use identity mapping for PCI devices behind bridges · 3dfc813d
      David Woodhouse 提交于
      Our current strategy for pass-through mode is to put all devices into
      the 1:1 domain at startup (which is before we know what their dma_mask
      will be), and only _later_ take them out of that domain, if it turns out
      that they really can't address all of memory.
      
      However, when there are a bunch of PCI devices behind a bridge, they all
      end up with the same source-id on their DMA transactions, and hence in
      the same IOMMU domain. This means that we _can't_ easily move them from
      the 1:1 domain into their own domain at runtime, because there might be DMA
      in-flight from their siblings.
      
      So we have to adjust our pass-through strategy: For PCI devices not on
      the root bus, and for the bridges which will take responsibility for
      their transactions, we have to start up _out_ of the 1:1 domain, just in
      case.
      
      This fixes the BUG() we see when we have 32-bit-capable devices behind a
      PCI-PCI bridge, and use the software identity mapping.
      
      It does mean that we might end up using 'normal' mapping mode for some
      devices which could actually live with the faster 1:1 mapping -- but
      this is only for PCI devices behind bridges, which presumably aren't the
      devices for which people are most concerned about performance.
      Signed-off-by: NDavid Woodhouse <David.Woodhouse@intel.com>
      3dfc813d
    • D
      intel-iommu: Use iommu_should_identity_map() at startup time too. · 6941af28
      David Woodhouse 提交于
      At boot time, the dma_mask won't have been set on any devices, so we
      assume that all devices will be 64-bit capable (and thus get a 1:1 map).
      Signed-off-by: NDavid Woodhouse <David.Woodhouse@intel.com>
      6941af28
  19. 04 7月, 2009 6 次提交
  20. 02 7月, 2009 6 次提交
  21. 30 6月, 2009 3 次提交