Skip to content

Commit

Permalink
x86/amd-iommu: Use only per-device dma_ops
Browse files Browse the repository at this point in the history
Unfortunatly there are systems where the AMD IOMMU does not
cover all devices. This breaks with the current driver as it
initializes the global dma_ops variable. This patch limits
the AMD IOMMU to the devices listed in the IVRS table fixing
DMA for devices not covered by the IOMMU.

Cc: stable@kernel.org
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
  • Loading branch information
Joerg Roedel committed Jun 6, 2011
1 parent 0de66d5 commit 27c2127
Showing 1 changed file with 24 additions and 2 deletions.
26 changes: 24 additions & 2 deletions arch/x86/kernel/amd_iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <asm/proto.h>
#include <asm/iommu.h>
#include <asm/gart.h>
#include <asm/dma.h>
#include <asm/amd_iommu_proto.h>
#include <asm/amd_iommu_types.h>
#include <asm/amd_iommu.h>
Expand Down Expand Up @@ -2383,6 +2384,23 @@ static struct dma_map_ops amd_iommu_dma_ops = {
.dma_supported = amd_iommu_dma_supported,
};

static unsigned device_dma_ops_init(void)
{
struct pci_dev *pdev = NULL;
unsigned unhandled = 0;

for_each_pci_dev(pdev) {
if (!check_device(&pdev->dev)) {
unhandled += 1;
continue;
}

pdev->dev.archdata.dma_ops = &amd_iommu_dma_ops;
}

return unhandled;
}

/*
* The function which clues the AMD IOMMU driver into dma_ops.
*/
Expand All @@ -2395,7 +2413,7 @@ void __init amd_iommu_init_api(void)
int __init amd_iommu_init_dma_ops(void)
{
struct amd_iommu *iommu;
int ret;
int ret, unhandled;

/*
* first allocate a default protection domain for every IOMMU we
Expand All @@ -2421,7 +2439,11 @@ int __init amd_iommu_init_dma_ops(void)
swiotlb = 0;

/* Make the driver finally visible to the drivers */
dma_ops = &amd_iommu_dma_ops;
unhandled = device_dma_ops_init();
if (unhandled && max_pfn > MAX_DMA32_PFN) {
/* There are unhandled devices - initialize swiotlb for them */
swiotlb = 1;
}

amd_iommu_stats_init();

Expand Down

0 comments on commit 27c2127

Please sign in to comment.