Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -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 @@ void __init gart_iommu_hole_init(void)

	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 ||
+2 −1
Original line number Diff line number Diff line
@@ -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++) {