Commit 28af24bb authored by Dave Jones's avatar Dave Jones

[AGPGART] Fix up misprogrammed bridges with incorrect AGPv2 rates.

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.

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.

This will prevent errors like..

agpgart: Found an AGP 3.5 compliant device at 0000:00:00.0.
agpgart: req mode 1f000201 bridge_agpstat 1f000a14 vga_agpstat 2f000217.
agpgart: Device is in legacy mode, falling back to 2.x
agpgart: Putting AGP V2 device at 0000:00:00.0 into 0x mode
agpgart: Putting AGP V2 device at 0000:01:00.0 into 0x mode
agpgart: Putting AGP V2 device at 0000:01:00.1 into 0x mode

https://bugs.freedesktop.org/show_bug.cgi?id=8816Signed-off-by: default avatarDave Jones <davej@redhat.com>
parent 18088748
...@@ -419,6 +419,31 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ ...@@ -419,6 +419,31 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
*requested_mode &= ~AGP2_RESERVED_MASK; *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. */ /* Check the speed bits make sense. Only one should be set. */
tmp = *requested_mode & 7; tmp = *requested_mode & 7;
switch (tmp) { switch (tmp) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment