summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2012-06-12 18:51:12 +0400
committerJoerg Roedel <joerg.roedel@amd.com>2012-07-17 14:17:12 +0400
commitb9b1ce707d81ec63c04e4fd8c34699ada950e6dc (patch)
tree987bf73e990db4268325e25149cd7397de0dfea9
parent62410eeb40ef355fa47f63886542f4dacef13ba9 (diff)
downloadlinux-b9b1ce707d81ec63c04e4fd8c34699ada950e6dc.tar.xz
iommu/amd: Introduce amd_iommu_init_dma routine
This function will initialize everthing necessary so that devices can do DMA. This includes dma_ops and iommu_ops. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
-rw-r--r--drivers/iommu/amd_iommu_init.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index 966d8ac9e147..53828b61e9ac 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -1627,8 +1627,6 @@ int __init amd_iommu_init_hardware(void)
enable_iommus();
- amd_iommu_init_notifier();
-
register_syscore_ops(&amd_iommu_syscore_ops);
return ret;
@@ -1669,6 +1667,25 @@ static bool detect_ivrs(void)
return true;
}
+static int amd_iommu_init_dma(void)
+{
+ int ret;
+
+ if (iommu_pass_through)
+ ret = amd_iommu_init_passthrough();
+ else
+ ret = amd_iommu_init_dma_ops();
+
+ if (ret)
+ return ret;
+
+ amd_iommu_init_api();
+
+ amd_iommu_init_notifier();
+
+ return 0;
+}
+
/*
* This is the core init function for AMD IOMMU hardware in the system.
* This function is called from the generic x86 DMA layer initialization
@@ -1690,11 +1707,7 @@ static int __init amd_iommu_init(void)
if (ret)
goto free;
- if (iommu_pass_through)
- ret = amd_iommu_init_passthrough();
- else
- ret = amd_iommu_init_dma_ops();
-
+ ret = amd_iommu_init_dma();
if (ret)
goto free;