| From 4b83873d3da0704987cb116833818ed96214ee29 Mon Sep 17 00:00:00 2001 |
| From: Joerg Roedel <joerg.roedel@amd.com> |
| Date: Wed, 7 Apr 2010 12:57:35 +0200 |
| Subject: x86/gart: Disable GART explicitly before initialization |
| |
| From: Joerg Roedel <joerg.roedel@amd.com> |
| |
| commit 4b83873d3da0704987cb116833818ed96214ee29 upstream. |
| |
| If we boot into a crash-kernel the gart might still be |
| enabled and its caches might be dirty. This can result in |
| undefined behavior later. Fix it by explicitly disabling the |
| gart hardware before initialization and flushing the caches |
| after enablement. |
| |
| Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/kernel/aperture_64.c | 15 ++++++++++++++- |
| arch/x86/kernel/pci-gart_64.c | 3 +++ |
| 2 files changed, 17 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/aperture_64.c |
| +++ b/arch/x86/kernel/aperture_64.c |
| @@ -389,6 +389,7 @@ void __init gart_iommu_hole_init(void) |
| for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { |
| int bus; |
| int dev_base, dev_limit; |
| + u32 ctl; |
| |
| bus = bus_dev_ranges[i].bus; |
| dev_base = bus_dev_ranges[i].dev_base; |
| @@ -401,7 +402,19 @@ void __init gart_iommu_hole_init(void) |
| iommu_detected = 1; |
| gart_iommu_aperture = 1; |
| |
| - aper_order = (read_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL) >> 1) & 7; |
| + ctl = read_pci_config(bus, slot, 3, |
| + AMD64_GARTAPERTURECTL); |
| + |
| + /* |
| + * Before we do anything else disable the GART. It may |
| + * still be enabled if we boot into a crash-kernel here. |
| + * Reconfiguring the GART while it is enabled could have |
| + * unknown side-effects. |
| + */ |
| + ctl &= ~GARTEN; |
| + write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl); |
| + |
| + aper_order = (ctl >> 1) & 7; |
| aper_size = (32 * 1024 * 1024) << aper_order; |
| aper_base = read_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE) & 0x7fff; |
| aper_base <<= 25; |
| --- a/arch/x86/kernel/pci-gart_64.c |
| +++ b/arch/x86/kernel/pci-gart_64.c |
| @@ -553,6 +553,9 @@ static void enable_gart_translations(voi |
| |
| enable_gart_translation(dev, __pa(agp_gatt_table)); |
| } |
| + |
| + /* Flush the GART-TLB to remove stale entries */ |
| + k8_flush_garts(); |
| } |
| |
| /* |