Solution for issues with Intel 845g graphic cards on Linux

Recently, I installed Debian Squeeze (6.0.5) on my old Zenith machine with a bit modest specs (384 MB RAM & 40GB HDD). It also had an Intel Extreme graphics 82845g for a video card.

While using the system I faced one major annoyance that in retrospect, was traced to my video card. My machine used to suddenly hang at random intervals.  When I switched to tty1 by pressing ctrl+alt+F1, I saw something like this:

X.Org X Server 1.7.7
Release Date: 2010-05-04
X Protocol Version 11, Revision 0
Build Operating System: Linux 2.6.32-5-amd64 i686 Debian
Current Operating System: Linux workstation1 2.6.32-5-686 #1 SMP Sun May 6 04:01:19........
Kernel Command Line....
...
...
..
FATAL: Module fbcon not found.
SELinux: Disabled on system, not enabling in X server
(EE) Intel(0): Detected a hung GPU, disabling acceleration.

After a bit of googling, I found out that this behaviour was quite usual for most Intel cards in the i8xx series that included my card too. Turns out that Intel has not released the complete specs for this card that are needed to develop an open-source driver. As a result of this, all Windows machines will run in full acceleration with Intel’s proprietary drivers, whereas the Linux folk have to find an alternative or suffer these hangs/crashes. You can find the notes from the developer of Xorg’s driver here.

If you are facing this same problem, there are two workarounds available. I’ve tested these on debian squeeze and they both worked for me. Hopefully one of them should work for you.

Workaround [1]: Use the generic vesa driver instead of the intel driver. You may not get the cutting-edge graphics on your screen, but you will get a more robust machine. If you choose to do this step, you will also have to disable kms (kernel mode setting) as vesa does not support it. If you decide to go for this step, here is how you go about doing it:

1. First locate your /etc/X11/xorg.conf file and open in your text editor. You can find your driver configuration in the device section somewhere like:

….

Driver      “intel”
VendorName  “Intel Corporation”
BoardName   “82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device”
BusID       “PCI:0:2:0”

…..

If there is no xorg.conf file in /etc/X11 folder, then you will have to generate one. To do this, log-in as root on command prompt and perform these steps (make sure that no x-session is running on a terminal when you do this):

I.) Xorg -configure               (this will generate the xorg.conf file)

II.) mv /root/xorg.new.conf /etc/X11/xorg.conf

2. Now that you have located the driver section, you can change it by simply replacing “intel” with “vesa”. To do this change, again you have to login as root on the command prompt. You can use your default console editor such as vi or nano for this.

3. The last step is to disable kms (kernel mode setting) for the vesa driver. To do this edit the file /etc/modprobe.d/i915-kms.conf and replace modeset=1 with modeset=0.

4. Reboot your machine and test the new display.

Workaround [2]: This alternative workaround is also available if you are intent on using the intel driver instead of the vesa one. However, the stability is not as much guaranteed as the vesa solution, and you might have to do some experimenting. To do this, just edit the /etc/X11/xorg.conf while logging as a root on the command prompt (If the xorg.conf file does not exist, see how to generate it in Workaround-1). Uncomment some driver options in your device section and set those values as follows:

Section “Device”
### Available Driver options are:-
### Values: <i>: integer, <f>: float, <bool>: “True”/”False”,
### <string>: “String”, <freq>: “<f> Hz/kHz/MHz”
### [arg]: arg optional
        Option     “AccelMethod” “uxa”           # [<str>]
        Option     “DRI”        “false”            # [<bool>]
#Option     “ColorKey”               # <i>
#Option     “VideoKey”               # <i>
#Option     “FallbackDebug”          # [<bool>]
        Option     “Tiling” “false”                 # [<bool>]
        Option     “Shadow”     “true”                # [<bool>]
#Option     “SwapbuffersWait”        # [<bool>]
#Option     “XvMC”                   # [<bool>]
#Option     “XvPreferOverlay”        # [<bool>]
#Option     “DebugFlushBatches”      # [<bool>]
#Option     “DebugFlushCaches”       # [<bool>]
#Option     “DebugWait”              # [<bool>]
    Option    “MigrationHeuristic” “greedy”
Identifier  “Card0”
Driver      “intel”
VendorName  “Intel Corporation”
BoardName   “82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device”
BusID       “PCI:0:2:0”
EndSection

Reboot your machine after saving xorg.conf. The bold options above are those that worked for me. Just remember that setting Shadow to true and DRI to false will work in most cases, so just try setting those two options first.

EDIT: As of today (18-07-2012), it seems that the issue is permanently resolved in the next debian release (testing/wheezy).  I installed the backports packages for xorg and the newer kernel version (3.2) and the issue resolved even with the default xorg.conf configuration.