Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart
authorLinus Torvalds <torvalds@woody.osdl.org>
Wed, 13 Dec 2006 02:53:04 +0000 (18:53 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Wed, 13 Dec 2006 02:53:04 +0000 (18:53 -0800)
* master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart:
  [AGPGART] VIA and SiS AGP chipsets are x86-only
  [AGPGART] agp-amd64: section mismatches with HOTPLUG=n
  [AGPGART] Fix up misprogrammed bridges with incorrect AGPv2 rates.

drivers/char/agp/Kconfig
drivers/char/agp/generic.c

index c603bf2915803e0e9d243b6d82d5db317780b473..a9f9c48c2424c8f307061bdf7feda686d7a996ab 100644 (file)
@@ -86,7 +86,7 @@ config AGP_NVIDIA
 
 config AGP_SIS
        tristate "SiS chipset support"
-       depends on AGP
+       depends on AGP && X86
        help
          This option gives you AGP support for the GLX component of
          X on Silicon Integrated Systems [SiS] chipsets.
@@ -103,7 +103,7 @@ config AGP_SWORKS
 
 config AGP_VIA
        tristate "VIA chipset support"
-       depends on AGP
+       depends on AGP && X86
        help
          This option gives you AGP support for the GLX component of
          X on VIA MVP3/Apollo Pro chipsets.
index 5ff457b41efbc4b4a349fa4ee90e4413c6249134..883a36a278332ee6912ab9f19be236e3548ec5aa 100644 (file)
@@ -419,6 +419,31 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
                *requested_mode &= ~AGP2_RESERVED_MASK;
        }
 
+       /*
+        * Some dumb bridges are programmed to disobey the AGP2 spec.
+        * This is likely a BIOS misprogramming rather than poweron default, or
+        * it would be a lot more common.
+        * https://bugs.freedesktop.org/show_bug.cgi?id=8816
+        * AGPv2 spec 6.1.9 states:
+        *   The RATE field indicates the data transfer rates supported by this
+        *   device. A.G.P. devices must report all that apply.
+        * Fix them up as best we can.
+        */
+       switch (*bridge_agpstat & 7) {
+       case 4:
+               *bridge_agpstat |= (AGPSTAT2_2X | AGPSTAT2_1X);
+               printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x4 rate"
+                       "Fixing up support for x2 & x1\n");
+               break;
+       case 2:
+               *bridge_agpstat |= AGPSTAT2_1X;
+               printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x2 rate"
+                       "Fixing up support for x1\n");
+               break;
+       default:
+               break;
+       }
+
        /* Check the speed bits make sense. Only one should be set. */
        tmp = *requested_mode & 7;
        switch (tmp) {