Manual modesetting for xf86-video-intel
The new x86-video-intel-2.0.0 driver (known in Gentoo as xf86-video-i810-2.0.0) does automatic modesetting: instead of relying on the video BIOS for a list of resolutions your laptop’s screen supports (which is always the wrong list on modern machines), the new driver reads the information directly from the monitor using DDC over i2c. Which is in theory better - unless, of course, your monitor lists the wrong resolution in its DDC.
My Dell Inspiron 6000’s flat panel’s DDC happens to list the following resolutions: 1920×1200, 1024×768, 800×600, and 640×480. The latter three do not match the screen’s 16:10 aspect ratio, so there is no good reason for them to be in the list. On the other hand, the list doesn’t contain 1680×1050 and 1280×800 (which are 16:10 resolutions that enable one to achieve better framerates on one’s puny Intel 915GM graphics card). With the old non-modesetting driver, one could use 915resolution to hack the video BIOS and write in custom resolutions. Unfortunately, there is, AFAIK, know way to modify a monitor’s DDC. Furthermore, the draditional xfree86 and xorg method of setting resolutions (Section "Screen" -> SubSection "Display" -> Modes "1680x1050" "1280x800" etc) no longer has any effect, probably thanks to the randr-1.2 black magic in xorg-server-1.3. So what is an Inspiron 6000 owner supposed to do?
By reading the past few months of the xorg@fdo mailing list and extrapolating from the information therein, I have arrived at a workable solution. Edit your xorg.conf to look something like:
Section "Monitor"
Identifier "Dell LFP"
Option "DPMS"
HorizSync 31.5-100
VertRefresh 58-61
DisplaySize 331 207
Modeline "1920x1200" 162.00 1920 2020 2108 2160 1200 1201 1204 1250 -hsync +vsync
Modeline "1680x1050" 149.00 1680 1760 1944 2280 1050 1050 1052 1089 -hsync +vsync
Modeline "1280x800" 83.46 1280 1344 1480 1680 800 801 804 828 -hsync +vsync
Modeline "1024x640" 52.83 1024 1072 1176 1328 640 641 644 663 -hsync +vsync
Modeline "800x500" 31.33 800 824 904 1008 500 501 504 518 -hsync +vsync
Modeline "1024x768" 65.00 1024 1048 1184 1344 768 771 777 806 -hsync +vsync
Modeline "800x600" 40.00 800 840 968 1056 600 601 605 628 -hsync +vsync
Modeline "640x480" 25.20 640 656 752 800 480 490 492 525 -hsync +vsync
Option "PreferredMode" "1680x1050"
EndSection
Section "Device"
Identifier "Intel 915GM"
Driver "intel"
BusID "PCI:0:2:0"
Option "DRI" "true"
Option "XVideo" "true"
VideoRam 131072
Option "XAANoOffscreenPixmaps" "true"
Option "Monitor-LVDS" "Dell LFP"
EndSection
The first key point is Option "Monitor-LVDS" "Dell LFP". Without this option, the Intel driver will override any custom resolution you may have defined. You need to use "Monitor-LVDS" for your laptop’s built-in screen and "Monitor-VGA" for external VGA output. For external DVI output, it’s either "Monitor-DVI" or perhaps "Monitor-TMDS-1". Naturally, the Monitor-* option is not documented anywhere.
The second key point is Option "PreferredMode" "1680x1050". This guarantees that gdm etc. starts at the resolution you want instead of at the highest one.
The third key point is VertRefresh 58-61. The problem is that your LCD screen may report that it only supports 60Hz, and although you generated 60Hz custom modelines, some of them might actually have a vertical refresh of, for example, 59.97Hz or 60.002Hz, which will cause X to complain and fill your Xorg.0.log with messages like
(II) intel(0): Not using default mode "1280x800" (vrefresh out of range)
So you need to override the 60Hz to account for rounding errors.
Oh, and to create all those custom modelines, I used the highly useful cgi script at http://www.sh.nu/nvidia/gtf.php (C version).
Now, the next task is to figure out why the new driver gives me a 30% lower framerate in glxgears…