Package: kernel-source-2.6.7
Version: 2.6.7-2
Severity: normal
Tags: patch

There's a bug n the kernel that doesn't permit the correct 
identification of the chipset used by the AGPGART driver if this is a 
VIA chipset. (fo example KT600 identified as CLE266 )

This bug is solved in a newer version of AGPGART driver , an update that 
solve this problem is included:

Bye

Marcello

agpgart-2004-06-17.diff :

diff -Nru a/drivers/char/agp/Kconfig b/drivers/char/agp/Kconfig
--- a/drivers/char/agp/Kconfig  2004-06-17 00:04:01 +01:00
+++ b/drivers/char/agp/Kconfig  2004-06-17 00:04:01 +01:00
@@ -165,7 +165,7 @@
        tristate "Transmeta Efficeon support"
        depends on AGP && X86 && !X86_64
        help
-         This option fives you AGP support for the Transmeta Efficeon
+         This option gives you AGP support for the Transmeta Efficeon
          series processors with integrated northbridges.
 
          You should say Y here if you use XFree86 3.3.6 or 4.x and want 
to
diff -Nru a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
--- a/drivers/char/agp/generic.c        2004-06-17 00:04:01 +01:00
+++ b/drivers/char/agp/generic.c        2004-06-17 00:04:01 +01:00
@@ -1,6 +1,6 @@
 /*
  * AGPGART driver.
- * Copyright (C) 2002-2003 Dave Jones.
+ * Copyright (C) 2002-2004 Dave Jones.
  * Copyright (C) 1999 Jeff Hartmann.
  * Copyright (C) 1999 Precision Insight, Inc.
  * Copyright (C) 1999 Xi Graphics, Inc.
@@ -18,12 +18,12 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT 
SHALL
- * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, 
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 
OR 
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
+ * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT 
OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
- * TODO: 
+ * TODO:
  * - Allocate more than order 0 pages to avoid too much linear map 
splitting.
  */
 #include <linux/config.h>
@@ -37,7 +37,7 @@
 #include <linux/vmalloc.h>
 #include "agp.h"
 
-__u32 *agp_gatt_table; 
+__u32 *agp_gatt_table;
 int agp_memory_reserved;
 
 /*
@@ -46,7 +46,7 @@
  */
 EXPORT_SYMBOL_GPL(agp_memory_reserved);
 
-/* 
+/*
  * Generic routines for handling agp_memory structures -
  * They use the basic page allocation routines to do the brunt of the 
work.
  */
@@ -142,12 +142,12 @@
  *     agp_allocate_memory  -  allocate a group of pages of a certain 
type.
  *
  *     @page_count:    size_t argument of the number of pages
- *     @type:  u32 argument of the type of memory to be allocated.  
+ *     @type:  u32 argument of the type of memory to be allocated.
  *
  *     Every agp bridge device will allow you to allocate 
AGP_NORMAL_MEMORY which
  *     maps to physical ram.  Any other type is device dependent.
  *
- *     It returns NULL whenever memory is unavailable. 
+ *     It returns NULL whenever memory is unavailable.
  */
 struct agp_memory *agp_allocate_memory(size_t page_count, u32 type)
 {
@@ -311,7 +311,7 @@
 
 /**
  *     agp_bind_memory  -  Bind an agp_memory structure into the GATT.
- * 
+ *
  *     @curr:          agp_memory pointer
  *     @pg_start:      an offset into the graphics aperture translation 
table
  *
@@ -347,9 +347,9 @@
 
 /**
  *     agp_unbind_memory  -  Removes an agp_memory structure from the 
GATT
- * 
+ *
  * @curr:      agp_memory pointer to be removed from the GATT.
- * 
+ *
  * It returns -EINVAL if this piece of agp_memory is not currently 
bound to
  * the graphics aperture translation table or if the agp_memory pointer 
== NULL
  */
@@ -404,12 +404,18 @@
                *cmd &= ~(AGPSTAT2_1X | AGPSTAT2_4X);   /* 2X */
 
        if (*cmd & AGPSTAT2_1X)
-               *cmd &= ~(AGPSTAT2_2X | AGPSTAT2_4X);   /* 1Xf */
+               *cmd &= ~(AGPSTAT2_2X | AGPSTAT2_4X);   /* 1X */
 }
 
-
+/*
+ * mode = requested mode.
+ * cmd = PCI_AGP_STATUS from agp bridge.
+ * tmp = PCI_AGP_STATUS from graphic card.
+ */
 static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
 {
+       u32 origcmd=*cmd, origtmp=*tmp;
+
        /* ARQSZ - Set the value to the maximum one.
         * Don't allow the mode register to override values. */
        *cmd = ((*cmd & ~AGPSTAT_ARQSZ) |
@@ -452,17 +458,43 @@
                *mode |= AGPSTAT3_4X;
        }
 
-       if (!((*cmd & AGPSTAT3_8X) && (*tmp & AGPSTAT3_8X) && (*mode & 
AGPSTAT3_8X)))
-               *cmd &= ~AGPSTAT3_8X;
+       if (*mode & AGPSTAT3_8X) {
+               if (!(*cmd & AGPSTAT3_8X)) {
+                       *cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
+                       *cmd |= ~AGPSTAT3_4X;
+                       printk ("%s requested AGPx8 but bridge not 
capable.\n", current->comm);
+                       return;
+               }
+               if (!(*tmp & AGPSTAT3_8X)) {
+                       *cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
+                       *cmd |= ~AGPSTAT3_4X;
+                       printk ("%s requested AGPx8 but graphic card not 
capable.\n", current->comm);
+                       return;
+               }
+               /* All set, bridge & device can do AGP x8*/
+               *cmd &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
+               return;
 
-       if (!((*cmd & AGPSTAT3_4X) && (*tmp & AGPSTAT3_4X) && (*mode & 
AGPSTAT3_4X)))
-               *cmd &= ~AGPSTAT3_4X;
+       } else {
 
-       /* Clear out unwanted bits. */
-       if (*cmd & AGPSTAT3_8X)
-               *cmd &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
-       if (*cmd & AGPSTAT3_4X)
+               /*
+                * If we didn't specify AGPx8, we can only do x4.
+                * If the hardware can't do x4, we're up shit creek, and 
never
+                *  should have got this far.
+                */
                *cmd &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
+               if ((*cmd & AGPSTAT3_4X) && (*tmp & AGPSTAT3_4X))
+                       *cmd |= ~AGPSTAT3_4X;
+               else {
+                       printk (KERN_INFO PFX "Badness. Don't know which 
AGP mode to set. "
+                                                       "[cmd:%x tmp:%x 
fell back to:- cmd:%x tmp:%x]\n",
+                                                       origcmd, 
origtmp, *cmd, *tmp);
+                       if (!(*cmd & AGPSTAT3_4X))
+                               printk (KERN_INFO PFX "Bridge couldn't 
do AGP x4.\n");
+                       if (!(*tmp & AGPSTAT3_4X))
+                               printk (KERN_INFO PFX "Graphic card 
couldn't do AGP x4.\n");
+               }
+       }
 }
 
 //FIXME: This doesn't smell right.
@@ -479,8 +511,10 @@
                if (!cap_ptr)
                        continue;
 
+               //FIXME: We should probably skip anything here that
+               // isn't an AGP graphic card.
                /*
-                * Ok, here we have a AGP device. Disable impossible 
+                * Ok, here we have a AGP device. Disable impossible
                 * settings, and adjust the readqueue to the minimum.
                 */
                pci_read_config_dword(device, cap_ptr+PCI_AGP_STATUS, 
&tmp);
@@ -489,7 +523,7 @@
                cmd = ((cmd & ~AGPSTAT_RQ_DEPTH) |
                     min_t(u32, (mode & AGPSTAT_RQ_DEPTH),
                         min_t(u32, (cmd & AGPSTAT_RQ_DEPTH), (tmp & 
AGPSTAT_RQ_DEPTH))));
-               
+
                /* disable FW if it's not supported */
                if (!((cmd & AGPSTAT_FW) && (tmp & AGPSTAT_FW) && (mode 
& AGPSTAT_FW)))
                        cmd &= ~AGPSTAT_FW;
@@ -663,7 +697,7 @@
                                            agp_bridge->current_size;
                                        break;
                                }
-                               temp = agp_bridge->current_size;        
+                               temp = agp_bridge->current_size;
                        } else {
                                agp_bridge->aperture_size_idx = i;
                        }
@@ -684,7 +718,7 @@
                SetPageReserved(page);
 
        agp_bridge->gatt_table_real = (u32 *) table;
-       agp_gatt_table = (void *)table; 
+       agp_gatt_table = (void *)table;
 
        agp_bridge->driver->cache_flush();
        agp_bridge->gatt_table = ioremap_nocache(virt_to_phys(table),
@@ -870,9 +904,9 @@
 EXPORT_SYMBOL(agp_generic_free_by_type);
 
 
-/* 
+/*
  * Basic Page Allocation Routines -
- * These routines handle page allocation and by default they reserve 
the allocated 
+ * These routines handle page allocation and by default they reserve 
the allocated
  * memory.  They also handle incrementing the current_memory_agp value, 
Which is checked
  * against a maximum value.
  */
@@ -914,9 +948,9 @@
 /* End Basic Page Allocation Routines */
 
 
-/** 
+/**
  * agp_enable  -  initialise the agp point-to-point connection.
- * 
+ *
  * @mode:      agp mode register value to configure with.
  */
 void agp_enable(u32 mode)
diff -Nru a/drivers/char/agp/sworks-agp.c 
b/drivers/char/agp/sworks-agp.c
--- a/drivers/char/agp/sworks-agp.c     2004-06-17 00:04:01 +01:00
+++ b/drivers/char/agp/sworks-agp.c     2004-06-17 00:04:01 +01:00
@@ -447,6 +447,7 @@
        struct agp_bridge_data *bridge;
        struct pci_dev *bridge_dev;
        u32 temp, temp2;
+       u8 cap_ptr = 0;
 
        /* Everything is on func 1 here so we are hardcoding function 
one */
        bridge_dev = pci_find_slot((unsigned int)pdev->bus->number,
@@ -457,6 +458,8 @@
                return -ENODEV;
        }
 
+       cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
+
        switch (pdev->device) {
        case 0x0006:
                /* ServerWorks CNB20HE
@@ -470,14 +473,15 @@
                break;
 
        default:
-               printk(KERN_ERR PFX "Unsupported Serverworks chipset "
-                               "(device id: %04x)\n", pdev->device);
+               if (cap_ptr)
+                       printk(KERN_ERR PFX "Unsupported Serverworks 
chipset "
+                                       "(device id: %04x)\n", 
pdev->device);
                return -ENODEV;
        }
 
        serverworks_private.svrwrks_dev = bridge_dev;
        serverworks_private.gart_addr_ofs = 0x10;
-       
+
        pci_read_config_dword(pdev, SVWRKS_APSIZE, &temp);
        if (temp & PCI_BASE_ADDRESS_MEM_TYPE_64) {
                pci_read_config_dword(pdev, SVWRKS_APSIZE + 4, &temp2);
diff -Nru a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c
--- a/drivers/char/agp/via-agp.c        2004-06-17 00:04:01 +01:00
+++ b/drivers/char/agp/via-agp.c        2004-06-17 00:04:01 +01:00
@@ -434,6 +434,7 @@
        .subvendor      = PCI_ANY_ID,                   \
        .subdevice      = PCI_ANY_ID,                   \
        }
+       ID(PCI_DEVICE_ID_VIA_82C597_0),
        ID(PCI_DEVICE_ID_VIA_82C598_0),
        ID(PCI_DEVICE_ID_VIA_8501_0),
        ID(PCI_DEVICE_ID_VIA_8601_0),




-- System Information:
Debian Release: testing/unstable
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.6.7
Locale: [EMAIL PROTECTED], [EMAIL PROTECTED]

Versions of packages kernel-source-2.6.7 depends on:
ii  binutils                   2.14.90.0.7-8 The GNU assembler, linker and bina
ii  bzip2                      1.0.2-1       A high-quality block-sorting file 
ii  coreutils [fileutils]      5.0.91-2      The GNU core utilities
ii  fileutils                  5.0.91-2      The GNU file management utilities 

-- no debconf information


Reply via email to