In this page I explain how to obtain the 3D acceleration from the Asus A4K Ati Radeon 9700 mobility. To obtain this result a little fix in the MTRR registers is needed.
Some times ago I’ve found a solution to this problem and I wrote a guide on my Italian blog to set up this notebook.. I think i was the first one on the web who wrote how to solve this MTRR problem, then someone requested a translation of this part, and I’ve finally written it.
I’m still not very good with English, so if you have some correction they will be welcome 🙂
So.. here we are!
Overview
lspci
00:00.0 Host bridge: nVidia Corporation nForce3 Host Bridge (rev a4)
00:01.0 ISA bridge: nVidia Corporation nForce3 LPC Bridge (rev f6)
00:01.1 SMBus: nVidia Corporation nForce3 SMBus (rev a4)
00:02.0 USB Controller: nVidia Corporation nForce3 USB 1.1 (rev a5)
00:02.1 USB Controller: nVidia Corporation nForce3 USB 1.1 (rev a5)
00:02.2 USB Controller: nVidia Corporation nForce3 USB 2.0 (rev a2)
00:06.0 Multimedia audio controller: nVidia Corporation nForce3 Audio (rev a2)
00:06.1 Modem: nVidia Corporation nForce3 Audio (rev a2)
00:08.0 IDE interface: nVidia Corporation nForce3 IDE (rev a5)
00:0a.0 PCI bridge: nVidia Corporation nForce3 PCI Bridge (rev a2)
00:0b.0 PCI bridge: nVidia Corporation nForce3 AGP Bridge (rev a4)
00:18.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
01:00.0 VGA compatible controller: ATI Technologies Inc RV350 [Mobility Radeon 9600 M10]
02:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8001 Gigabit Ethernet Controller (rev 13)
02:01.0 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev b3)
02:01.1 FireWire (IEEE 1394): Ricoh Co Ltd R5C552 IEEE 1394 Controller (rev 08)
02:01.2 Generic system peripheral [0805]: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (rev 17)
02:01.3 System peripheral: Ricoh Co Ltd R5C592 Memory Stick Bus Host Adapter (rev 08)
Amd64 (K8) 3200+ with 512 MB of ram (i upgraded it to 2 GB) 400DDR, Ati Mobility Radeon 9700 with 128 MB of video ram, chipset nVidia nForce3 as audio card, agp bridge and usb controller. (Win)Modem 56k Conexant (Linuxant). Firewire IEEE 1394 e CARD Reader (SD/SDIO/MMC/MS…). 4 usb 2.0 ports e embedded usb wireless card.
Graphic Card
Open Drivers (radeon)
With the open drivers we can see some bad visual artifacts, the 3d acceleration seems to work, and have good results in some case, but miss some feature that lead to a fallback in software rendering in some case!
Here an example of the “visual artifacts” i was talking aboug: they happen at random, sometimes they aren’t there, sometimes worst then what you see here (click on the image to see it at full size)
Fallback to software rendering happen when a not implemented OpenGL function is needed by an application, and all the 3d rendering is computed by the processor as if you don’ t have any 3d accelerated graphic card. Anyway open drivers keep getting better, it’s now possible to play games like Quake 3 or Tremulous without big problems.
They doesn’t support the SVIDEO TV output.
AIGLX + Compiz works (cube + wobble windows), but don’t expect all the plugins to work. Actually the windows resizing is very slow and the whole system become really slow with some effects.
GL_VERSION: 1.3 Mesa 6.5.1
GL_VENDOR: Tungsten Graphics, Inc.
GL_RENDERER: Mesa DRI R300 20060815 AGP 1x TCL
as you can see here the 1x AGP is used
Proprietary Drivers (fglrx)
For many use you need the ATI proprietary drivers (fglrlx), they support all the OpenGL features but the Composite extension (needed for AIGLX to work), they have some problem too as we will see later.
Go and take the fglrx drivers, then install as you like. The following part explain a way to install this driver, but you can use the way you like.
Installing the driver on Debian using apt-get and module assistant
I’ve Debian so i used apt-get (or you can use synaptic if you prefer a graphical interface):
$ apt-get install fglrx-driver fglrx-kernel-src fglrx-control fglrx-control-qt3 module-assistant
the last package (modul-assistant) is useful to compile the module
using module-assistant:
$ m-a a-i fglrx
this should compile and install the module driver for you graphic card
now edit /etc/X11/xorg.conf and change the driver from “radeon” to “fglrx”
Section “Device”
Identifier “ATI Technologies Inc RV350 [Mobility Radeon 9600 M10]”
Driver “fglrx”
# Driver “radeon”
BusID “PCI:1:0:0”
Option “TVFormat” “PAL-B” # Italian Standard TV (for the SVIDEO output)EndSection
restart X or reboot the system.
The 3D MTRR problem
at this point the visual artifacts are gone, but no 3d acceleration.. how can you check it?
i propose 2 way:
$ glxinfo
name of display: :0.0
display: :0 screen: 0
direct rendering: No <————————— no 3d acceleration
or
$ fglrxinfo
display: :0.0 screen: 0
OpenGL vendor string: Mesa project: www.mesa3d.org
OpenGL renderer string: Mesa GLX Indirect
OpenGL version string: 1.2 (1.5 Mesa 6.4.2)
MESA are software OpenGL drivers wich doesn’t use the graphic card.
now notice
$ dmesg
[fglrx] Maximum main memory to use for locked dma buffers: 1899 MBytes.
[fglrx] module loaded – fglrx 8.27.10 [Jul 27 2006] on minor 0
ACPI: PCI Interrupt Link [LNKE] enabled at IRQ 11
ACPI: PCI Interrupt 0000:01:00.0[A] -> Link [LNKE] -> GSI 11 (level, low) -> IRQ 11
mtrr: no more MTRRs available
[fglrx:firegl_addmap] *ERROR* mtrr allocation failed (-28)
[fglrx] Internal AGP support requested, but kernel AGP support active.
[fglrx] Have to use kernel AGP support to avoid conflicts.
[fglrx] AGP detected, AgpState = 0x1f00421b (hardware caps of chipset)
mtrr: no more MTRRs available
[fglrx:firegl_unlock] *ERROR* Process 4540 using kernel context 0
and /var/log/Xorg.0.log contains:
(II) fglrx(0): [drm] register handle = 0x00004000
(EE) fglrx(0): [agp] unable to acquire AGP, error “xf86_ENOSPC”
(EE) fglrx(0): cannot init AGP
(II) fglrx(0): [drm] removed 1 reserved context for kernel
(II) fglrx(0): [drm] unmapping 8192 bytes of SAREA 0x2000 at 0xb71af000
(WW) fglrx(0): ***********************************************
(WW) fglrx(0): * DRI initialization failed! *
(WW) fglrx(0): * (maybe driver kernel module missing or bad) *
(WW) fglrx(0): * 2D acceleraton available (MMIO) *
(WW) fglrx(0): * no 3D acceleration available *
(WW) fglrx(0): ********************************************* *
and here the problem:
$ cat /proc/mtrr
reg00: base=0x00000000 ( 0MB), size= 16MB: write-back, count=1
reg01: base=0x01000000 ( 16MB), size= 16MB: write-back, count=1
reg02: base=0x02000000 ( 32MB), size= 32MB: write-back, count=1
reg03: base=0x04000000 ( 64MB), size= 64MB: write-back, count=1
reg04: base=0x08000000 ( 128MB), size= 128MB: write-back, count=1
reg05: base=0x10000000 ( 256MB), size= 256MB: write-back, count=1
reg06: base=0x20000000 ( 512MB), size= 512MB: write-back, count=1
reg07: base=0x40000000 (1024MB), size=1024MB: write-back, count=1
understanding the problem
now…. many of you will ask ourself: what the hell is MTRR? more or less i asked myself the same question sometimes ago.. (it token me a lot of time to figure out the problem was here). Briefly: it’s a technology to control the way the processor access to memory areas; it can boost the writing/reading performance of data from memory up to 250%. This is very useful to access the AGP and the video ram.
So… where’s the problem? There are 8 available register for MTRR on any system, in my ( your?) system they are all busy! I’ve 2 GB of Ram, the first 7 ones are taken by the first GB, and the last one for the second GB.
When the X server get loaded ( graphic server) it try to automatically load the agp modules for your video card; each module will try to add MTRR registers for is own memory, if all register are busy it will give some error and the will disable all the stuff that need MTRR to work leaving you without a 3D acceleration.
i take one of this register to explain its meaning:
reg01: base=0x01000000 ( 16MB), size= 16MB: write-back, count=1
register 1 (the 2nd, it start from zero)
it refers to the memory area from address “base” to “base+size“.
now, the memory address are usually are written in hexadecimal format: so 0x01000000 in hexadecimal is the Byte 16777216 in decimal, you can check this by using the calculator of your system. If you divide that number by 1024 for two times you will get the MBytes… guess what is that number? 16 MB, is the one written between the brackets.
this mean it start from 16 MB and has a size of 16 MB; now check all the registers, they are a remapping of the first 2 GB, in other words: the first register start at 0 MB and go until 16 MB, the second start from 16 MB and go to 32 MB, the third register start at 32MB and go to 64MB, and so on, without a blank space between one register to the next one. And they all are of the same type (write-back, count=1 )
NOTE: since only 2 register are needed for the agp and graphic card probably you suffer of this problem only if you have more then 512MB. If you have 512MB of Ram you should have 2 register free, either case the patch doesn’t hurt 🙂
Now i show you how to solve the problem…
How to solve the problem
The best solution I’ve found is to reconstruct the MTRR registers structure adding a script at boot time to fix them. Copy and paste this script in /etc/init.d/ ( let’s call it fix-mtrr )then create a simbolic link in /etc/rcS.d/ to start this soon after “mountkernfs.sh”. ( ln -s /etc/init.d/fix-mtrr /etc/rcS.d/S03fix-mtrr ). Reboot and you should have a working 3D using the MTRR boost up. Here the script, YOU HAVE TO ADAPT IT TO YOUR RAM AMOUNT as explained down here
#!/bin/sh -e ### BEGIN INIT INFO # Provides: mtrr-fix # Required-Start: mountkernfs # Required-Stop: # Default-Start: S # Default-Stop: ### END INIT INFO PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" . /lib/lsb/init-functions case "$1" in start) log_action_begin_msg "Fixing MTRR..." for i in 1 2 3 4 5 0 6 7; do echo "disable=$i" >| /proc/mtrr; done; echo "base=0x00000000 size=0x80000000 type=write-back" >| /proc/mtrr log_action_end_msg 0 ;; *) echo "Usage: /etc/init.d/fix-mtrr {start}" exit 1 ;; esac exit 0
if for any reason this script didn’t work try this out
#!/bin/shfor i in 1 2 3 4 5 0 6 7; do echo "disable=$i" >| /proc/mtrr; done;echo "base=0x00000000 size=0x80000000 type=write-back" >| /proc/mtrr
any script you chose.. pay attention to this line:
for i in 1 2 3 4 5 0 6 7;
this is good if you have 2GB of RAM, if you have 1 GB you have to delete the number “7”, if you have 512 you have to remove numbers “6” and “7”.
how can you understand how to do it generally? from the output of “cat /proc/mtrr“, the numbers in that line should be the ones of type “write-back” in the mtrr table
now pay attention to this line too:
echo “base=0x00000000 size=0x20000000 type=write-back” >| /proc/mtrr
Change the bold value to match your RAM amount, ( I’m talking of your system RAM, NOT the Video Ram), you can use this list to found out what’s the right number for you.
128 MB = 0x08000000
256 MB = 0x10000000
512 MB = 0x20000000
1 GB = 0x40000000
2 GB = 0x80000000
Step by step:
- create a new text file and copy the script above in it
- adapt the script to your amount of ram following the instructions above
- save the file and call it “fix-mtrr”
- now give that file the execution permission ( chmod +x fix-mtrr ) and copy it in /etc/init.d/ ( you will need root rights to copy it in this directory )
- now create a symbolic link to get it automatically launched at boot time: ln -s /etc/init.d/fix-mtrr /etc/rcS.d/S03fix-mtrr
- reboot
now your 3D acceleration should work
$ fglrxinfo
display: :0.0 screen: 0
OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: MOBILITY RADEON 9700 Generic
OpenGL version string: 2.0.6011 (8.28.8)
Alternative / old / harder / worst method
this method disable the mtrr in the fglrx driver, this means you will NOT have the 250% boost up of the MTRR technology. This was my first solution.. I wrote this here to remember it and to give a more complete understanding of “how it work” to the reader
you need to manually modify and recompile the fglrx module for this to work, so alternative/automatic method will not work with this solution 🙂
in the directory of the source code of the module /usr/src/modules/fglrx-kernel/fglrx/build_mod/
edit the file firegl-public.c substituting all occurrences of CONFIG_MTRR with XCONFIG_MTRR. (if you use Vim you can do this with this command “:%s/CONFIG_MTRR/XCONFIG_MTRR/g“)
what this editing does? it makes the fglrx module to think that kernel doesn’t have an MTRR support build into it. The driver got compiled in a different way that doesn’t use the MTRR this way.
Some consideration
I think the MTRR problem is due to a bug in the bios. But I’m not sure about it
the following doesn’t depend on the MTRR problem/fix, they depends on the Ati fgrlx drivers, and could be different in each version of the drivers, they are referred to the 8.28.8 drivers
The fglrx driver sometimes lead my system to a complete crash. This happen at random.. and not very often if you don’t use 3D screensavers, but is really annoying… please.. ATI.. write a decent driver!
Clone Screen (TV out) work out of the box.. you just have to restart X server or reboot when you connect a TV to the SVIDEO output. If you have a PAL TV (cause you live in Europe for example) you will see in Black and White.. just add Option “TVFormat” “PAL-B” to your xorg.conf. I didn’t find a way to change the primary screen, so if you use the XV extension for video playback you have to disable it to see your films/video on the TV, i usually use the GL extension
Aiglx doesn’t work because ATI doesn’t want to support the Composite Extension needed by Aiglx for now. This mean you can have Compiz or Beryl running using the proprietary Driver, unless you decide to install XGL, and this isn’t really user friendly.
I’m not upgrading my fglrx driver because last time i tried the TV out stopped to work.
Hope this will be helpful to someone
20 dicembre, 2007 at 10:40
@Maximus
what do you mean with “continuation of the topic” ?
do you want me to translate the other part of my italian article too?
20 dicembre, 2007 at 9:02
I would like to see a continuation of the topic
7 settembre, 2007 at 13:18
@Susanne
that’s strange 😀
but i’m happy it work now!
did you used the “short version” of the script?
anyway.. i’m happy you have 3d acceleration now
6 settembre, 2007 at 18:40
Mastro,
it works !!!! 🙂 🙂 🙂 🙂
I had to experiment a bit… most strange thing is, that, despite having only 1280 MB RAM I have to put in 0x80000000 (instead of 0x50000000, what I would expect being correct).
I put the script in my boot.local, started and – voila 🙂 it worked.
thanks a lot once more, you gave me the last drive to try it once more 🙂
all the best to you
Susanne
1 settembre, 2007 at 3:19
[…] Here i explain how to fix this problem, it’s a translation of my italian article on my laptop. […]
1 settembre, 2007 at 0:36
so I will be patient…:-) thanks a lot Mastro
will go to bed now
cheers
Susanne
1 settembre, 2007 at 0:02
@susanne
i think i know what the problem is..
may be this script doesn’t work if you havent a debian system..
i never thinked about this..
but i will write a script that work with ANY system 🙂
for now try the one up here.. i’ve fixed some crap that wordpress build in..
thanks for your testing 😀
and.. i swear it.. it work.. i’m using it right now with 2GB ram 🙂
31 agosto, 2007 at 22:01
@susanne
i think i found out the problem
wordpress do some crap with the article when the “pre” tag is used…
i fixed the script
try to recreate it and re-modify it now 🙂
sorry
31 agosto, 2007 at 21:55
tell me the output of
cat /proc/mtrr
and the output of
fglrxinfo
maybe a
dmesg | tail
could be useful too
31 agosto, 2007 at 21:08
hi Mastro,
despite your excellent HowTo I couldn’t succeed…
I did everything as you described it – created the script by copying, put it into /etc/init.d, made it executable, created the link in ./rcS.d, attached the fix-mtrr command to my “depend-start” (I’m running a Suse10.2) – but nothing happens – I can’t find any hint in boot.msg or messages that the script worked. The mtrrs are unchanged.
I also tried to copy the script directly into boot.local, but then I got an error: it said “write error” when trying to execute that line
echo “base=0x00000000 size=0x20000000 type=write-back” >| /proc/mtrr
so, with all mtrrs disabled and no ones set the system is no longer accessable in a reasonable manner…
I have also a Fedora7 on my machine and tried it there too. But there is no directory “rcS.d” so I put the link into “rc5.d”
my knowledge is too low to estimate this being the right place… anyway, the script will be started, but not executed because of error message regarding the line
echo “Usage: /etc/init.d/fix-mtrr {start}”
obviously the system doesn’t know what to do with “Usage”…
so, I must say, I’m lost now… it was not my first attempt in fixing that ugly mtrr problem – I tried almost evrything I could find on the internet – finally I rebuilt my memory to 512 MB again…
If you have any idea what I could try further I would be thankful otherwise I think it’s better to give up…
thanks a lot anyway for your effort, this was very kind of you!
best regards
Susanne
30 agosto, 2007 at 18:03
[…] You can find the MTRR solution part English translation here […]