aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorChris Wright <chrisw@sous-sol.org>2009-06-15 09:53:45 -0400
committerJoerg Roedel <joerg.roedel@amd.com>2009-06-15 09:53:45 -0400
commita8c485bb6857811807d42f9fd1fde2f5f89cc5c9 (patch)
treea87f877258454e5d48a39162d895a0fada250a36 /arch/x86/kernel
parent42a49f965a8d24ed92af04f5b564d63f17fd9c56 (diff)
amd-iommu: disable cmd buffer and evt logging before reprogramming iommu
The IOMMU spec states that IOMMU behavior may be undefined when the IOMMU registers are rewritten while command or event buffer is enabled. Disable them in IOMMU disable path. Signed-off-by: Chris Wright <chrisw@sous-sol.org> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/amd_iommu_init.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
index 575ca46211bb..48a79b9b2f9e 100644
--- a/arch/x86/kernel/amd_iommu_init.c
+++ b/arch/x86/kernel/amd_iommu_init.c
@@ -260,6 +260,14 @@ static void iommu_enable(struct amd_iommu *iommu)
260 260
261static void iommu_disable(struct amd_iommu *iommu) 261static void iommu_disable(struct amd_iommu *iommu)
262{ 262{
263 /* Disable command buffer */
264 iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
265
266 /* Disable event logging and event interrupts */
267 iommu_feature_disable(iommu, CONTROL_EVT_INT_EN);
268 iommu_feature_disable(iommu, CONTROL_EVT_LOG_EN);
269
270 /* Disable IOMMU hardware itself */
263 iommu_feature_disable(iommu, CONTROL_IOMMU_EN); 271 iommu_feature_disable(iommu, CONTROL_IOMMU_EN);
264} 272}
265 273
@@ -1042,6 +1050,7 @@ static void enable_iommus(void)
1042 struct amd_iommu *iommu; 1050 struct amd_iommu *iommu;
1043 1051
1044 for_each_iommu(iommu) { 1052 for_each_iommu(iommu) {
1053 iommu_disable(iommu);
1045 iommu_set_device_table(iommu); 1054 iommu_set_device_table(iommu);
1046 iommu_enable_command_buffer(iommu); 1055 iommu_enable_command_buffer(iommu);
1047 iommu_enable_event_buffer(iommu); 1056 iommu_enable_event_buffer(iommu);