Re: AGP problem SiS 746FX Linux 2.6.5-rc3

From: Oliver Schoett
Date: Sat Apr 17 2004 - 10:47:15 EST

Dave Jones <davej@xxxxxxxxxx> writes:

> Ok, so your system is fully AGP v3 compliant, (both host and gfx card).
> The missing check highlighted in your diff means that we only do
> AGPv3 stuff if we have an AGP 3.5 host bridge. You have a 3.0 bridge,
> so it was falling back to AGP v2. My suspicion now is that the 648 and
> 746 chipsets vary too much for them to both use the generic routines,
> so I'll reinstate the check. It'll still report that it finds an
> AGP v3.0 device, but until someone comes forward with chipset docs,
> it looks like it'll be limited to AGP v2. (I'm amazed that it works
> at all, really).

Here is some information about the AGP mode checks I learned from
Oliver Heilmann: The two chipsets SiS 648 and SiS 648FX both have the
chipset ID 0x0648, but need different initalisation code. The way to
distinguish them is that the 648FX reports itself as AGP v3.5 capable,
while the 648 reports itself as AGP v3.0 capable. This is handled
correctly in Heilmann's patch in his Article
<1obEA-82t-11@xxxxxxxxxxxxxxxx> Date: Thu, 12 Feb 2004 00:10:08 +0100:

+static void __devinit sis_get_driver(struct agp_bridge_data *bridge)
+ if(bridge->dev->device==PCI_DEVICE_ID_SI_648)
+ {
+ if(agp_bridge->major_version==3 && agp_bridge->minor_version < 5)
+ {
+ sis_driver.agp_enable=sis_648_enable;
+ }
+ else
+ {
+ sis_driver.agp_enable = sis_648_enable;
+ sis_driver.aperture_sizes = agp3_generic_sizes;
+ sis_driver.size_type = U16_APER_SIZE;
+ sis_driver.num_aperture_sizes = AGP_GENERIC_SIZES_ENTRIES;
+ sis_driver.configure = agp3_generic_configure;
+ sis_driver.fetch_size = agp3_generic_fetch_size;
+ sis_driver.cleanup = agp3_generic_cleanup;
+ sis_driver.tlb_flush = agp3_generic_tlbflush;
+ }
+ }
+ bridge->driver=&sis_driver;

Please preserve this distinction in your patch and don't degrade the
SiS 648 chipset to AGP 2.0 (currently, 2.6.5 runs fine with AGP 3.0 on
my SiS 648 chipset).

By the way, I noticed an oddity in the changeset the line

- set_current_state(TASK_INTERRUPTIBLE);


+ set_current_state(TASK_UNINTERRUPTIBLE);

Which of the two settings is correct?


Oliver Schoett

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at