aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86_64/kernel/pci-dma.c5
-rw-r--r--arch/x86_64/kernel/pci-gart.c20
-rw-r--r--arch/x86_64/kernel/reboot.c4
-rw-r--r--include/asm-x86_64/proto.h7
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
324void 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
574void 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
574void __init gart_iommu_init(void) 594void __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)
81void machine_shutdown(void) 82void 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
116void machine_emergency_restart(void) 120void 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;
85extern unsigned cpu_khz; 85extern unsigned cpu_khz;
86extern unsigned tsc_khz; 86extern unsigned tsc_khz;
87 87
88extern void pci_iommu_shutdown(void);
88extern void no_iommu_init(void); 89extern void no_iommu_init(void);
89extern int force_iommu, no_iommu; 90extern int force_iommu, no_iommu;
90extern int iommu_detected; 91extern int iommu_detected;
91#ifdef CONFIG_IOMMU 92#ifdef CONFIG_IOMMU
92extern void gart_iommu_init(void); 93extern void gart_iommu_init(void);
94extern void gart_iommu_shutdown(void);
93extern void __init gart_parse_options(char *); 95extern void __init gart_parse_options(char *);
94extern void iommu_hole_init(void); 96extern void iommu_hole_init(void);
95extern int fallback_aper_order; 97extern 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
107static inline void gart_iommu_shutdown(void)
108{
109}
110
104#endif 111#endif
105 112
106extern int reboot_force; 113extern int reboot_force;