Commit f3eee542 authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar

x86: Gart: fix breakage due to IOMMU initialization cleanup

This fixes the following breakage of the commit
75f1cdf1:

- 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: default avatarYinghai Lu <yinghai@kernel.org>
Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
LKML-Reference: <1260759135-6450-3-git-send-email-fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent f4780ca0
...@@ -280,7 +280,8 @@ void __init early_gart_iommu_check(void) ...@@ -280,7 +280,8 @@ void __init early_gart_iommu_check(void)
* or BIOS forget to put that in reserved. * or BIOS forget to put that in reserved.
* try to update e820 to make that region as 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 ctl;
u32 aper_size = 0, aper_order = 0, last_aper_order = 0; u32 aper_size = 0, aper_order = 0, last_aper_order = 0;
u64 aper_base = 0, last_aper_base = 0; u64 aper_base = 0, last_aper_base = 0;
...@@ -290,6 +291,8 @@ void __init early_gart_iommu_check(void) ...@@ -290,6 +291,8 @@ void __init early_gart_iommu_check(void)
return; return;
/* This is mostly duplicate of iommu_hole_init */ /* This is mostly duplicate of iommu_hole_init */
agp_aper_base = search_agp_bridge(&agp_aper_order, &valid_agp);
fix = 0; fix = 0;
for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) {
int bus; int bus;
...@@ -342,10 +345,10 @@ void __init early_gart_iommu_check(void) ...@@ -342,10 +345,10 @@ void __init early_gart_iommu_check(void)
} }
} }
if (!fix) if (valid_agp)
return; 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++) { for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) {
int bus; int bus;
int dev_base, dev_limit; int dev_base, dev_limit;
...@@ -458,8 +461,6 @@ out: ...@@ -458,8 +461,6 @@ out:
if (aper_alloc) { if (aper_alloc) {
/* Got the aperture from the AGP bridge */ /* Got the aperture from the AGP bridge */
} else if (!valid_agp) {
/* Do nothing */
} else if ((!no_iommu && max_pfn > MAX_DMA32_PFN) || } else if ((!no_iommu && max_pfn > MAX_DMA32_PFN) ||
force_iommu || force_iommu ||
valid_agp || valid_agp ||
......
...@@ -710,7 +710,8 @@ static void gart_iommu_shutdown(void) ...@@ -710,7 +710,8 @@ static void gart_iommu_shutdown(void)
struct pci_dev *dev; struct pci_dev *dev;
int i; int i;
if (no_agp) /* don't shutdown it if there is AGP installed */
if (!no_agp)
return; return;
for (i = 0; i < num_k8_northbridges; i++) { for (i = 0; i < num_k8_northbridges; i++) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment