x86: Gart: fix breakage due to IOMMU initialization cleanup
authorYinghai Lu <yinghai@kernel.org>
Mon, 14 Dec 2009 02:52:15 +0000 (11:52 +0900)
committerIngo Molnar <mingo@elte.hu>
Mon, 14 Dec 2009 07:57:40 +0000 (08:57 +0100)
This fixes the following breakage of the commit
75f1cdf1dda92cae037ec848ae63690d91913eac:

- GART systems that don't AGP with broken BIOS and more than 4GB
  memory are forced to use swiotlb. They can allocate aperture by
  hand and use GART.

- GART systems without GAP must disable GART on shutdown.

- swiotlb usage is forced by the boot option,
  gart_iommu_hole_init() is not called, so we disable GART
  early_gart_iommu_check().

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
LKML-Reference: <1260759135-6450-3-git-send-email-fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/aperture_64.c
arch/x86/kernel/pci-gart_64.c

index e0dfb6856aa297ef9349dc36c3b5cef93b5abbf0..3704997e8b2573bda630720f4c47bd4a7ec3b8c5 100644 (file)
@@ -280,7 +280,8 @@ void __init early_gart_iommu_check(void)
         * or BIOS forget to put that in reserved.
         * try to update e820 to make that region as reserved.
         */
-       int i, fix, slot;
+       u32 agp_aper_base = 0, agp_aper_order = 0;
+       int i, fix, slot, valid_agp = 0;
        u32 ctl;
        u32 aper_size = 0, aper_order = 0, last_aper_order = 0;
        u64 aper_base = 0, last_aper_base = 0;
@@ -290,6 +291,8 @@ void __init early_gart_iommu_check(void)
                return;
 
        /* This is mostly duplicate of iommu_hole_init */
+       agp_aper_base = search_agp_bridge(&agp_aper_order, &valid_agp);
+
        fix = 0;
        for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) {
                int bus;
@@ -342,10 +345,10 @@ void __init early_gart_iommu_check(void)
                }
        }
 
-       if (!fix)
+       if (valid_agp)
                return;
 
-       /* different nodes have different setting, disable them all at first*/
+       /* disable them all at first */
        for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) {
                int bus;
                int dev_base, dev_limit;
@@ -458,8 +461,6 @@ out:
 
        if (aper_alloc) {
                /* Got the aperture from the AGP bridge */
-       } else if (!valid_agp) {
-               /* Do nothing */
        } else if ((!no_iommu && max_pfn > MAX_DMA32_PFN) ||
                   force_iommu ||
                   valid_agp ||
index e6a0d402f1714dec4aff2e160b0eff255ea5307b..56c0e730d3fe7bd09913d092c01f009f94f53974 100644 (file)
@@ -710,7 +710,8 @@ static void gart_iommu_shutdown(void)
        struct pci_dev *dev;
        int i;
 
-       if (no_agp)
+       /* don't shutdown it if there is AGP installed */
+       if (!no_agp)
                return;
 
        for (i = 0; i < num_k8_northbridges; i++) {