[ltp] Savage IX-MV / Thinkpad T20/T21/T22 AGP incompatibility

Bryce Harrington linux-thinkpad@linux-thinkpad.org
Fri, 21 Mar 2008 19:03:25 -0700


Hi Alex,

A couple years ago you looked into[1] a problem with certain savage
cards on a particular Intel AGP bridge, and identified as a workaround
to force it to use BusType PCI, which has been documented as a
semi-official workaround by the thinkpad community[2].

This workaround has been quite thoroughly tested by Ubuntu users[3].  In
the spirit of minimizing xorg.conf hacking they need to do, I'd like to
put this into Ubuntu's savage driver.  I've made a first cut at a
patch[4], and would appreciate if you could take a look.  In particular,
while I think I have an adequate check for the device PCI ID, I'm
uncertain how to test the host bridge id?

Thanks,
Bryce

1: http://mailman.linux-thinkpad.org/pipermail/linux-thinkpad/2006-March/032672.html
2: http://www.thinkwiki.org/wiki/Problem_with_video_related_system_lockup
3: https://bugs.launchpad.net/ubuntu/hardy/+source/xserver-xorg-video-savage/+bug/33617
4: http://launchpadlibrarian.net/12802717/03_s3_savage_ix_mv_agp_bridge_incompat.diff



diff -Nurp xserver-xorg-video-savage-2.1.3-patched/src/savage_driver.c xserver-xorg-video-savage-2.1.3-working/src/savage_driver.c
--- xserver-xorg-video-savage-2.1.3-patched/src/savage_driver.c	2008-03-21 17:27:16.000000000 -0700
+++ xserver-xorg-video-savage-2.1.3-working/src/savage_driver.c	2008-03-21 18:34:57.000000000 -0700
@@ -1535,6 +1535,25 @@ static Bool SavagePreInit(ScrnInfoPtr pS
 		       "Invalid BusType option, using %s DMA\n",
 		       psav->IsPCI ? "PCI" : "AGP");
 	}
+    } else {
+        /* Thinkpads T10, T21, T22 fail in AGP mode with this specific card
+         * due to an AGP bridge incompatibility (LP: #33617)
+         *
+         * S3 Inc. 86C270-294 Savage/IX-MV (rev 13)
+         *  (chip 5333:8c12 card 1014:017f)
+         *
+         * "Intel 440BX/ZX/DX - 82443BX/ZX/DX" AGP bridge
+         *  (8086:7192)
+         * TODO:  Need to also verify the bridge ID
+         */
+        if (VENDOR_ID(psav->PciInfo) == 0x1014 &&
+            DEVICE_ID(psav->PciInfo) == 0x017f
+            /* && bridge == 8086:7192 (TODO: how to do this?) */
+            )
+        {
+            psav->IsPCI = TRUE;
+            xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "BusType set to PCI (see LP: #33617)\n");
+        }
     }
 
     psav->AgpDMA = !psav->IsPCI;