Andreas and other interested folks,
I just grabbed the 2.4.21-139 kernel, built it and installed it on my
Tyan S2885ANRF. It now finds the 8151 AGP controller correctly, and seems
to correctly identify both AGP110 (ATI X1) and older AGP v2 cards, go into
4x/8x modes fine and the like.
However, if you take video-card-of-your-choice, map its framebuffer and set
the AGP bridge for fast writes, the write bandwidth to the framebuffer is BAD.
About a factor of 40 slower than it should be. A 1x card writes at about
18MB/s, a 4x card at 25 and an 8x card at 48MB/s. These numbers should be
256MB/s, 1GB/s and 2GB/s. Under no circumstances (1x, fast writes off)
should the bandwidth be less than 256MB/s.
I've tired this on lots of 760MPX machines and get the performance I expect,
but I am at a loss as to what could possibly be causing this slowness.
I notice that the Tyan board sets up the MTRR for the whole PCI physical
address space to be uncachable:
linux:~ # cat /proc/mtrr
reg00: base=0xc0000000 (3072MB), size=1024MB: uncachable, count=1
reg01: base=0xbe000000 (3040MB), size= 32MB: uncachable, count=1
In previous framebuffer drivers, I have set the MTRR for the frame buffer to
be write combining, which does have an effect on performance ('tho I've never
known the effect to be a factor of 40!). I'd like to do the same thing on
the Tyan board, but unsetting the c0000000-ffffffff uncacheable MTRR, or
fragmenting it so that everything in that region EXCEPT the framebuffer is
uncacheable both quickly lead to system crasshes (why? how could caching
the framebuffer hang the system in text mode (corrupt screen contents, sure)?
is this a race while the region is uncacheable?)
It seems there's something strange going on. Could this be some kind of
IOMMU interaction? The AGP aperture ends up at e0000000, which I cover
with an uncacheable MTRR entry when I try the fragments, so I don't THINK
I'm hurting anything.
Any ideas why it could possibly be so slow or what I might do to get it
back up to reasonable write speeds? Hard to do video when you can only
get 2 frames/sec into the card's RAM.