diff options
-rw-r--r-- | arch/x86_64/kernel/pci-dma.c | 5 | ||||
-rw-r--r-- | arch/x86_64/kernel/pci-gart.c | 20 | ||||
-rw-r--r-- | arch/x86_64/kernel/reboot.c | 4 | ||||
-rw-r--r-- | include/asm-x86_64/proto.h | 7 |
4 files changed, 36 insertions, 0 deletions
diff --git a/arch/x86_64/kernel/pci-dma.c b/arch/x86_64/kernel/pci-dma.c index 90f6315d02d4..be8dce40f651 100644 --- a/arch/x86_64/kernel/pci-dma.c +++ b/arch/x86_64/kernel/pci-dma.c | |||
@@ -321,6 +321,11 @@ static int __init pci_iommu_init(void) | |||
321 | return 0; | 321 | return 0; |
322 | } | 322 | } |
323 | 323 | ||
324 | void pci_iommu_shutdown(void) | ||
325 | { | ||
326 | gart_iommu_shutdown(); | ||
327 | } | ||
328 | |||
324 | #ifdef CONFIG_PCI | 329 | #ifdef CONFIG_PCI |
325 | /* Many VIA bridges seem to corrupt data for DAC. Disable it here */ | 330 | /* Many VIA bridges seem to corrupt data for DAC. Disable it here */ |
326 | 331 | ||
diff --git a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c index e587b65e754f..12acafdca791 100644 --- a/arch/x86_64/kernel/pci-gart.c +++ b/arch/x86_64/kernel/pci-gart.c | |||
@@ -571,6 +571,26 @@ static const struct dma_mapping_ops gart_dma_ops = { | |||
571 | .unmap_sg = gart_unmap_sg, | 571 | .unmap_sg = gart_unmap_sg, |
572 | }; | 572 | }; |
573 | 573 | ||
574 | void gart_iommu_shutdown(void) | ||
575 | { | ||
576 | struct pci_dev *dev; | ||
577 | int i; | ||
578 | |||
579 | if (no_agp && (dma_ops != &gart_dma_ops)) | ||
580 | return; | ||
581 | |||
582 | for (i = 0; i < num_k8_northbridges; i++) { | ||
583 | u32 ctl; | ||
584 | |||
585 | dev = k8_northbridges[i]; | ||
586 | pci_read_config_dword(dev, 0x90, &ctl); | ||
587 | |||
588 | ctl &= ~1; | ||
589 | |||
590 | pci_write_config_dword(dev, 0x90, ctl); | ||
591 | } | ||
592 | } | ||
593 | |||
574 | void __init gart_iommu_init(void) | 594 | void __init gart_iommu_init(void) |
575 | { | 595 | { |
576 | struct agp_kern_info info; | 596 | struct agp_kern_info info; |
diff --git a/arch/x86_64/kernel/reboot.c b/arch/x86_64/kernel/reboot.c index 7503068e788d..e6e65c2c63ef 100644 --- a/arch/x86_64/kernel/reboot.c +++ b/arch/x86_64/kernel/reboot.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <asm/pgtable.h> | 16 | #include <asm/pgtable.h> |
17 | #include <asm/tlbflush.h> | 17 | #include <asm/tlbflush.h> |
18 | #include <asm/apic.h> | 18 | #include <asm/apic.h> |
19 | #include <asm/proto.h> | ||
19 | 20 | ||
20 | /* | 21 | /* |
21 | * Power off function, if any | 22 | * Power off function, if any |
@@ -81,6 +82,7 @@ static inline void kb_wait(void) | |||
81 | void machine_shutdown(void) | 82 | void machine_shutdown(void) |
82 | { | 83 | { |
83 | unsigned long flags; | 84 | unsigned long flags; |
85 | |||
84 | /* Stop the cpus and apics */ | 86 | /* Stop the cpus and apics */ |
85 | #ifdef CONFIG_SMP | 87 | #ifdef CONFIG_SMP |
86 | int reboot_cpu_id; | 88 | int reboot_cpu_id; |
@@ -111,6 +113,8 @@ void machine_shutdown(void) | |||
111 | disable_IO_APIC(); | 113 | disable_IO_APIC(); |
112 | 114 | ||
113 | local_irq_restore(flags); | 115 | local_irq_restore(flags); |
116 | |||
117 | pci_iommu_shutdown(); | ||
114 | } | 118 | } |
115 | 119 | ||
116 | void machine_emergency_restart(void) | 120 | void machine_emergency_restart(void) |
diff --git a/include/asm-x86_64/proto.h b/include/asm-x86_64/proto.h index 85255db1e82d..b70aa0ccbe2d 100644 --- a/include/asm-x86_64/proto.h +++ b/include/asm-x86_64/proto.h | |||
@@ -85,11 +85,13 @@ extern int exception_trace; | |||
85 | extern unsigned cpu_khz; | 85 | extern unsigned cpu_khz; |
86 | extern unsigned tsc_khz; | 86 | extern unsigned tsc_khz; |
87 | 87 | ||
88 | extern void pci_iommu_shutdown(void); | ||
88 | extern void no_iommu_init(void); | 89 | extern void no_iommu_init(void); |
89 | extern int force_iommu, no_iommu; | 90 | extern int force_iommu, no_iommu; |
90 | extern int iommu_detected; | 91 | extern int iommu_detected; |
91 | #ifdef CONFIG_IOMMU | 92 | #ifdef CONFIG_IOMMU |
92 | extern void gart_iommu_init(void); | 93 | extern void gart_iommu_init(void); |
94 | extern void gart_iommu_shutdown(void); | ||
93 | extern void __init gart_parse_options(char *); | 95 | extern void __init gart_parse_options(char *); |
94 | extern void iommu_hole_init(void); | 96 | extern void iommu_hole_init(void); |
95 | extern int fallback_aper_order; | 97 | extern int fallback_aper_order; |
@@ -101,6 +103,11 @@ extern int fix_aperture; | |||
101 | #else | 103 | #else |
102 | #define iommu_aperture 0 | 104 | #define iommu_aperture 0 |
103 | #define iommu_aperture_allowed 0 | 105 | #define iommu_aperture_allowed 0 |
106 | |||
107 | static inline void gart_iommu_shutdown(void) | ||
108 | { | ||
109 | } | ||
110 | |||
104 | #endif | 111 | #endif |
105 | 112 | ||
106 | extern int reboot_force; | 113 | extern int reboot_force; |