Bug#257684: kernel-source-2.6.7: VIA AGP Chipsets not identified correctly
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: LANG=it_IT@euro, LC_CTYPE=it_IT@euro
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 to: