diff options
| author | Yinghai Lu <yinghai@kernel.org> | 2009-12-13 21:52:15 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-12-14 02:57:40 -0500 |
| commit | f3eee54276dfd1117fd94259f2b4a38388264724 (patch) | |
| tree | b51cb4d1dc14be52d6b91f59a6e27800e0c8a9cb | |
| parent | f4780ca005404166cc40af77ef0e86132ab98a81 (diff) | |
x86: Gart: fix breakage due to IOMMU initialization cleanup
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>
| -rw-r--r-- | arch/x86/kernel/aperture_64.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-gart_64.c | 3 |
2 files changed, 8 insertions, 6 deletions
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index e0dfb6856aa2..3704997e8b25 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
| @@ -280,7 +280,8 @@ void __init early_gart_iommu_check(void) | |||
| 280 | * or BIOS forget to put that in reserved. | 280 | * or BIOS forget to put that in reserved. |
| 281 | * try to update e820 to make that region as reserved. | 281 | * try to update e820 to make that region as reserved. |
| 282 | */ | 282 | */ |
| 283 | int i, fix, slot; | 283 | u32 agp_aper_base = 0, agp_aper_order = 0; |
| 284 | int i, fix, slot, valid_agp = 0; | ||
| 284 | u32 ctl; | 285 | u32 ctl; |
| 285 | u32 aper_size = 0, aper_order = 0, last_aper_order = 0; | 286 | u32 aper_size = 0, aper_order = 0, last_aper_order = 0; |
| 286 | u64 aper_base = 0, last_aper_base = 0; | 287 | u64 aper_base = 0, last_aper_base = 0; |
| @@ -290,6 +291,8 @@ void __init early_gart_iommu_check(void) | |||
| 290 | return; | 291 | return; |
| 291 | 292 | ||
| 292 | /* This is mostly duplicate of iommu_hole_init */ | 293 | /* This is mostly duplicate of iommu_hole_init */ |
| 294 | agp_aper_base = search_agp_bridge(&agp_aper_order, &valid_agp); | ||
| 295 | |||
| 293 | fix = 0; | 296 | fix = 0; |
| 294 | for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { | 297 | for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { |
| 295 | int bus; | 298 | int bus; |
| @@ -342,10 +345,10 @@ void __init early_gart_iommu_check(void) | |||
| 342 | } | 345 | } |
| 343 | } | 346 | } |
| 344 | 347 | ||
| 345 | if (!fix) | 348 | if (valid_agp) |
| 346 | return; | 349 | return; |
| 347 | 350 | ||
| 348 | /* different nodes have different setting, disable them all at first*/ | 351 | /* disable them all at first */ |
| 349 | for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { | 352 | for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { |
| 350 | int bus; | 353 | int bus; |
| 351 | int dev_base, dev_limit; | 354 | int dev_base, dev_limit; |
| @@ -458,8 +461,6 @@ out: | |||
| 458 | 461 | ||
| 459 | if (aper_alloc) { | 462 | if (aper_alloc) { |
| 460 | /* Got the aperture from the AGP bridge */ | 463 | /* Got the aperture from the AGP bridge */ |
| 461 | } else if (!valid_agp) { | ||
| 462 | /* Do nothing */ | ||
| 463 | } else if ((!no_iommu && max_pfn > MAX_DMA32_PFN) || | 464 | } else if ((!no_iommu && max_pfn > MAX_DMA32_PFN) || |
| 464 | force_iommu || | 465 | force_iommu || |
| 465 | valid_agp || | 466 | valid_agp || |
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index e6a0d402f171..56c0e730d3fe 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c | |||
| @@ -710,7 +710,8 @@ static void gart_iommu_shutdown(void) | |||
| 710 | struct pci_dev *dev; | 710 | struct pci_dev *dev; |
| 711 | int i; | 711 | int i; |
| 712 | 712 | ||
| 713 | if (no_agp) | 713 | /* don't shutdown it if there is AGP installed */ |
| 714 | if (!no_agp) | ||
| 714 | return; | 715 | return; |
| 715 | 716 | ||
| 716 | for (i = 0; i < num_k8_northbridges; i++) { | 717 | for (i = 0; i < num_k8_northbridges; i++) { |
