mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
x86: Gart: fix breakage due to IOMMU initialization cleanup
This fixes the following breakage of the commit
75f1cdf1dd
:
- 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>
This commit is contained in:
parent
f4780ca005
commit
f3eee54276
@ -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 ||
|
||||
|
@ -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++) {
|
||||
|
Loading…
Reference in New Issue
Block a user