Misbehaving EDID in nVidia Linux Drivers

I know, I know, long time without a post! I’ve been busy. Normal service will be resumed here shortly!

So the other day I wanted to hook up an old projector I’d gotten my hands on a while back to my MythTV box in a dual-screen (TwinView) configuration. So I duly plugged it in. Nothing happened. Updated the drivers (Ubuntu 10.10) through the hardware drivers panel, and while my normal monitor was fine, the projector wouldn’t allow a resolution greater than 640×480. Annoying.

Fortunately, I could trace this down to the EDID data from the projector being dodgy (or something along the way causing problems- the cable is a dodgy thing from China, so that’s a potential culprit). Basically, nVidia’s drivers don’t let you ignore EDID data, even with the NoEDID option in xorg.conf.

So what you end up having to do is actually pretty simple- basically, take the EDID from a working monitor and apply it to the broken display in xorg.conf. Dump the edid.bin through nvidia-settings, the GUI utility, and copy it up to /etc/X11/edid.bin.

Then you just edit your xorg.conf like so:

# This monitor is our dodgy one.
Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "CRT-0"
    HorizSync       28.0 - 33.0
    VertRefresh     43.0 - 72.0
    Option         "DPMS"
    # Note the option below.
    Option "CustomEDID" "CRT-0:/etc/X11/edid.bin"
    Option "PreferredMode" "1024x768"
#    Option "NoEDID" "True"
# This doesn't work! Ignore it.
# This monitor works with default EDID from the monitor.
Section "Monitor"
    Identifier     "Monitor1"
    VendorName     "Unknown"
    ModelName      "Samsung SyncMaster"
    HorizSync       63.6 - 63.6
    VertRefresh     60.0

And bam, you’ve got a working display! As I understand it, this will limit you to the resolutions in the EDID file, but if the monitors are a match or similar, this should work.

Finding out about this trick saved me many, many hours of fiddling about with xorg.conf, so I hope you too find this useful.