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

Commit a70b95c0 authored by Stephen Kitt's avatar Stephen Kitt Committed by Dave Airlie
Browse files

agp: ensure GART has an address before enabling it

Some BIOSs (eg.  the AMI BIOS on the Asus P4P800 motherboard) don't
initialise the GART address, and pcibios_assign_resources() can ignore it
because it can be marked as a host bridge (see
https://bugzilla.kernel.org/show_bug.cgi?id=24392#c5 for details).  This
was handled correctly up to 2.6.35, but the pci_enable_device() cleanup in
2.6.36 96576a9e ("agp: intel-agp: do not use PCI resources before
pci_enable_device()") means that the kernel tries to enable the GART
before assigning it an address; in such cases the GART overlaps with other
device assignments and ends up being disabled.

This patch fixes https://bugzilla.kernel.org/show_bug.cgi?id=24392



Note that I imagine efficeon-agp.c probably has the same problem, but
I can't test that and I'd like to make sure this patch is suitable for
-stable (since 2.6.36 and 2.6.37 are affected).

Signed-off-by: default avatarStephen Kitt <steve@sk2.org>
Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Maciej Rutecki <maciej.rutecki@gmail.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Kulikov Vasiliy <segooon@gmail.com>
Cc: Florian Mickler <florian@mickler.org>
Cc: <stable@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent cecd1455
Loading
Loading
Loading
Loading
+16 −11
Original line number Original line Diff line number Diff line
@@ -773,21 +773,15 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,


	dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
	dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);


	/*
	* If the device has not been properly setup, the following will catch
	* the problem and should stop the system from crashing.
	* 20030610 - hamish@zot.org
	*/
	if (pci_enable_device(pdev)) {
		dev_err(&pdev->dev, "can't enable PCI device\n");
		agp_put_bridge(bridge);
		return -ENODEV;
	}

	/*
	/*
	* The following fixes the case where the BIOS has "forgotten" to
	* The following fixes the case where the BIOS has "forgotten" to
	* provide an address range for the GART.
	* provide an address range for the GART.
	* 20030610 - hamish@zot.org
	* 20030610 - hamish@zot.org
	* This happens before pci_enable_device() intentionally;
	* calling pci_enable_device() before assigning the resource
	* will result in the GART being disabled on machines with such
	* BIOSs (the GART ends up with a BAR starting at 0, which
	* conflicts a lot of other devices).
	*/
	*/
	r = &pdev->resource[0];
	r = &pdev->resource[0];
	if (!r->start && r->end) {
	if (!r->start && r->end) {
@@ -798,6 +792,17 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
		}
		}
	}
	}


	/*
	* If the device has not been properly setup, the following will catch
	* the problem and should stop the system from crashing.
	* 20030610 - hamish@zot.org
	*/
	if (pci_enable_device(pdev)) {
		dev_err(&pdev->dev, "can't enable PCI device\n");
		agp_put_bridge(bridge);
		return -ENODEV;
	}

	/* Fill in the mode register */
	/* Fill in the mode register */
	if (cap_ptr) {
	if (cap_ptr) {
		pci_read_config_dword(pdev,
		pci_read_config_dword(pdev,