diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2009-06-09 11:52:27 -0400 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2009-06-15 09:20:40 -0400 |
commit | 0975904276552c8e201dad0ad31152ba8a21505a (patch) | |
tree | c7db491abe7dcb001c46ad30341475755f5b07ca /arch/x86 | |
parent | 92db1e6af747faa129e236d68386af26a0efc12b (diff) |
amd-iommu: disable IOMMU hardware on shutdown
When the IOMMU stays enabled the BIOS may not be able to finish the
machine shutdown properly. So disable the hardware on shutdown.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/include/asm/amd_iommu.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/amd_iommu_init.c | 5 | ||||
-rw-r--r-- | arch/x86/kernel/pci-dma.c | 2 |
3 files changed, 9 insertions, 0 deletions
diff --git a/arch/x86/include/asm/amd_iommu.h b/arch/x86/include/asm/amd_iommu.h index 262e02820049..bdf96f119f06 100644 --- a/arch/x86/include/asm/amd_iommu.h +++ b/arch/x86/include/asm/amd_iommu.h | |||
@@ -29,9 +29,11 @@ extern void amd_iommu_detect(void); | |||
29 | extern irqreturn_t amd_iommu_int_handler(int irq, void *data); | 29 | extern irqreturn_t amd_iommu_int_handler(int irq, void *data); |
30 | extern void amd_iommu_flush_all_domains(void); | 30 | extern void amd_iommu_flush_all_domains(void); |
31 | extern void amd_iommu_flush_all_devices(void); | 31 | extern void amd_iommu_flush_all_devices(void); |
32 | extern void amd_iommu_shutdown(void); | ||
32 | #else | 33 | #else |
33 | static inline int amd_iommu_init(void) { return -ENODEV; } | 34 | static inline int amd_iommu_init(void) { return -ENODEV; } |
34 | static inline void amd_iommu_detect(void) { } | 35 | static inline void amd_iommu_detect(void) { } |
36 | static inline void amd_iommu_shutdown(void) { } | ||
35 | #endif | 37 | #endif |
36 | 38 | ||
37 | #endif /* _ASM_X86_AMD_IOMMU_H */ | 39 | #endif /* _ASM_X86_AMD_IOMMU_H */ |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 238989ec077d..575ca46211bb 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
@@ -1273,6 +1273,11 @@ free: | |||
1273 | goto out; | 1273 | goto out; |
1274 | } | 1274 | } |
1275 | 1275 | ||
1276 | void amd_iommu_shutdown(void) | ||
1277 | { | ||
1278 | disable_iommus(); | ||
1279 | } | ||
1280 | |||
1276 | /**************************************************************************** | 1281 | /**************************************************************************** |
1277 | * | 1282 | * |
1278 | * Early detect code. This code runs at IOMMU detection time in the DMA | 1283 | * Early detect code. This code runs at IOMMU detection time in the DMA |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 745579bc8256..328592fb6044 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -290,6 +290,8 @@ static int __init pci_iommu_init(void) | |||
290 | void pci_iommu_shutdown(void) | 290 | void pci_iommu_shutdown(void) |
291 | { | 291 | { |
292 | gart_iommu_shutdown(); | 292 | gart_iommu_shutdown(); |
293 | |||
294 | amd_iommu_shutdown(); | ||
293 | } | 295 | } |
294 | /* Must execute after PCI subsystem */ | 296 | /* Must execute after PCI subsystem */ |
295 | fs_initcall(pci_iommu_init); | 297 | fs_initcall(pci_iommu_init); |