|
@@ -393,6 +393,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;
|
|
@@ -406,7 +407,19 @@ void __init gart_iommu_hole_init(void)
|
|
|
gart_iommu_aperture = 1;
|
|
|
x86_init.iommu.iommu_init = gart_iommu_init;
|
|
|
|
|
|
- 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;
|