Commit 89e54606 authored by Paul Mackerras's avatar Paul Mackerras Committed by Linus Torvalds

[PATCH] AGP 3.0 bogosities

There are other bogosities in drivers/char/agp/generic.c.  I can't
believe Dave ever tested that code with an AGP 3.0 device.  If you pass
in a mode that has the AGP 3.0 bit set, agp_v3_parse_one() will first
clear that bit (and print a message), and then complain because you
haven't got that bit set in the mode, with a message that the caller is
broken.  Furthermore, if the mode passed in has both the 4x and 8x bits
set, the new code will give you 4x where the old code would give you 8x
(which is what the caller wanted).

The patch below fixes this.  It will work in the 99.99% of cases where
we have one AGP bridge and one AGP video card.  We should eventually
cope with multiple AGP bridges, but doing the matching of bridges to
video cards is a hard problem because the video card is not necessarily
a child or sibling of the PCI device that we use for controlling the AGP
bridge.  I think we need to see an actual example of a system with
multiple AGP bridges first.

Oh, and by the way, I have 3D working relatively well on my G5 with a
64-bit kernel (and 32-bit X server and clients), which is why I care
about AGP 3.0 support.  :)
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c4d4d388
......@@ -322,7 +322,7 @@ extern int agp_try_unsupported_boot;
#define AGPCTRL_GTLBEN (1<<7)
#define AGP2_RESERVED_MASK 0x00fffcc8
#define AGP3_RESERVED_MASK 0x00ff00cc
#define AGP3_RESERVED_MASK 0x00ff00c4
#define AGP_ERRATA_FASTWRITES 1<<0
#define AGP_ERRATA_SBA 1<<1
......
......@@ -515,13 +515,9 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm);
*requested_mode |= AGPSTAT3_4X;
}
if (tmp == 3) {
printk (KERN_INFO PFX "%s tried to set rate=x3. Setting to AGP3 x4 mode.\n", current->comm);
*requested_mode |= AGPSTAT3_4X;
}
if (tmp >3) {
printk (KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp);
*requested_mode |= AGPSTAT3_8X;
if (tmp >= 3) {
printk (KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4);
*requested_mode = (*requested_mode & ~7) | AGPSTAT3_8X;
}
/* ARQSZ - Set the value to the maximum one.
......
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