Commit 5b0a5e84 authored by Dave Jones's avatar Dave Jones

[AGPGART] Do some sanity checks on the rates that userspace passes.

The AGP specifications define the following...

      agp2 agp3
000   BAD  BAD
001   x1   x4
010   x2   x8
011   BAD  x8
100   x4   BAD
101   BAD  BAD
110   BAD  BAD
111   BAD  BAD
Signed-off-by: default avatarDave Jones <davej@redhat.com>
parent 1b678004
......@@ -405,11 +405,28 @@ EXPORT_SYMBOL(agp_unbind_memory);
/* Generic Agp routines - Start */
static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_agpstat)
{
u32 tmp;
if (*requested_mode & AGP2_RESERVED_MASK) {
printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
*requested_mode &= ~AGP2_RESERVED_MASK;
}
/* Check the speed bits make sense. Only one should be set. */
tmp = *requested_mode & 7;
if (tmp == 0) {
printk (KERN_INFO PFX "Userspace tried to set rate=x0. Setting to x1 mode.\n");
*requested_mode |= AGPSTAT2_1X;
}
if (tmp == 3) {
printk (KERN_INFO PFX "Userspace tried to set rate=x3. Setting to x2 mode.\n");
*requested_mode |= AGPSTAT2_2X;
}
if (tmp >4) {
printk (KERN_INFO PFX "Userspace tried to set rate=x%d. Setting to x4 mode.\n", tmp);
*requested_mode |= AGPSTAT2_4X;
}
/* disable SBA if it's not supported */
if (!((*bridge_agpstat & AGPSTAT_SBA) && (*vga_agpstat & AGPSTAT_SBA) && (*requested_mode & AGPSTAT_SBA)))
*bridge_agpstat &= ~AGPSTAT_SBA;
......@@ -443,12 +460,28 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_agpstat)
{
u32 origbridge=*bridge_agpstat, origvga=*vga_agpstat;
u32 tmp;
if (*requested_mode & AGP3_RESERVED_MASK) {
printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
*requested_mode &= ~AGP3_RESERVED_MASK;
}
/* Check the speed bits make sense. */
tmp = *requested_mode & 7;
if (tmp == 0) {
printk (KERN_INFO PFX "Userspace tried to set rate=x0. Setting to AGP3 x4 mode.\n");
*requested_mode |= AGPSTAT3_4X;
}
if (tmp == 3) {
printk (KERN_INFO PFX "Userspace tried to set rate=x3. Setting to AGP3 x4 mode.\n");
*requested_mode |= AGPSTAT3_4X;
}
if (tmp >3) {
printk (KERN_INFO PFX "Userspace tried to set rate=x%d. Setting to AGP3 x8 mode.\n", tmp);
*requested_mode |= AGPSTAT3_8X;
}
/* ARQSZ - Set the value to the maximum one.
* Don't allow the mode register to override values. */
*bridge_agpstat = ((*bridge_agpstat & ~AGPSTAT_ARQSZ) |
......
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