Skip to content

Commit

Permalink
intel-iommu: No mapping for non-PCI devices
Browse files Browse the repository at this point in the history
This should fix kernel.org bug #11821, where the dcdbas driver makes up
a platform device and then uses dma_alloc_coherent() on it, in an
attempt to get memory < 4GiB.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
  • Loading branch information
David Woodhouse authored and David Woodhouse committed Jul 4, 2009
1 parent 62edf5d commit 7367683
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions drivers/pci/intel-iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -2457,10 +2457,15 @@ static int iommu_should_identity_map(struct pci_dev *pdev)
}

/* Check if the pdev needs to go through non-identity map and unmap process.*/
static int iommu_no_mapping(struct pci_dev *pdev)
static int iommu_no_mapping(struct device *dev)
{
struct pci_dev *pdev;
int found;

if (unlikely(dev->bus != &pci_bus_type))
return 1;

pdev = to_pci_dev(dev);
if (iommu_dummy(pdev))
return 1;

Expand Down Expand Up @@ -2516,7 +2521,7 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr,

BUG_ON(dir == DMA_NONE);

if (iommu_no_mapping(pdev))
if (iommu_no_mapping(hwdev))
return paddr;

domain = get_valid_domain_for_dev(pdev);
Expand Down Expand Up @@ -2656,7 +2661,7 @@ static void intel_unmap_page(struct device *dev, dma_addr_t dev_addr,
struct iova *iova;
struct intel_iommu *iommu;

if (iommu_no_mapping(pdev))
if (iommu_no_mapping(dev))
return;

domain = find_domain(pdev);
Expand Down Expand Up @@ -2747,7 +2752,7 @@ static void intel_unmap_sg(struct device *hwdev, struct scatterlist *sglist,
struct iova *iova;
struct intel_iommu *iommu;

if (iommu_no_mapping(pdev))
if (iommu_no_mapping(hwdev))
return;

domain = find_domain(pdev);
Expand Down Expand Up @@ -2806,7 +2811,7 @@ static int intel_map_sg(struct device *hwdev, struct scatterlist *sglist, int ne
struct intel_iommu *iommu;

BUG_ON(dir == DMA_NONE);
if (iommu_no_mapping(pdev))
if (iommu_no_mapping(hwdev))
return intel_nontranslate_map_sg(hwdev, sglist, nelems, dir);

domain = get_valid_domain_for_dev(pdev);
Expand Down

0 comments on commit 7367683

Please sign in to comment.