Fixing Ugly DVI/HDMI Displays due to EDID bugs on nVidia drivers

The good news: nVidia finally released their much awaited 173.14.09 video driver for linux. This officially supports the 2.6.25 kernel and supports the newest line of GeForce graphics cards.

The bad news: When you install the driver your HDMI/DVI digital flatpanel display looks horrible; the text looks jagged or blurred or oversharpened. There are halos and ringing anywhere there is contrast. The colors looked washed out and over bright. However, when you use the D-SUB (VGA) plug, everything works fine.

What is going on?

What is happening: Your monitor is providing EDID information to the driver that identifies that it is actually a TV. EDID stands for "extended display identification data" its a low level standard originally devised in 1994 that is basically a set a flags that tells the computer what the monitors capabilities are. The nVidia drivers see that you have a TV and decide to modify the signal in an attempt to make the picture look 'better' it also sometimes forces the output resolution to the standard TV resolutions (1080p/i, 720p, 480p/i).

How to fix it: You need to provide the nVidia driver with a new set of EDID flags. Specifically you need to change a single field so that the EDID does not report any extensions. Don't worry no soldering iron or hardware mods are required.

First, obtain a copy of your monitor's current EDID information. This can be done with the read-edid utility. However, it is apparently limited to x86-32. Since our network only has x86-64 systems, I had to resort to plugging the monitor into a Windows box and using Phoenix EDID Designer. Phoenix EDID Designer is both an EDID editor and a reader. You want to save the raw binary EDID information.

Update: You can use nvidia-settings to get your EDID info. Run nvidia-settings, click on DFP-0, then click "Acquire EDID..."

Now that you have your EDID information, you need to clear the extensions flag and update the checksum. If you are using the Phoenix EDID Designer, you can just change the field 'Number of extensions' in the General tab to 0. If you used read-edid or nvidia-settings to get your EDID, then you can use edid_disable_exts. It is a small utility that I wrote that does the same thing. See the page dedicated to it for more information.

Once you've created a modified EDID file, copy it to /etc/X11/something.edid

Finally, we have to tell the nVidia driver to use this EDID file instead of the one the monitor sends it. Open /etc/X11/xorg.conf.

Section "Device"
Identifier "nVidia"
Driver "nvidia"
Option "CustomEDID" "DFP-0:/etc/X11/L2410NM-modified.edid"
EndSection

 

Here we are using a Westinghouse L2410NM monitor, which has the EDID problems. We override the EDID with the CustomEDID option provided by the nVidia driver.

Finally, text and pictures look good again!

Discussion for this utility has moved to the edid_disable_exts forum

I asked if this utility helped solve your problem, put the name of your hardware in the comments below so that others can find it. I personally used this on a Westinghouse L2410NM. Unfortunately, my comment database has been corrupted, so I'm just going to paste in some of the useful information some people previously provided.

Envision L26W761

Works good, got rid of the "overscan" area that went off the edges of the screen. Only problem was the fonts are too small and looked ugly under Ubuntu, so I set the resolution down to 1280x720. I know there are utilities out there to customize a stock Ubuntu Unity desktop, but they're all haphazard and cover different things. So I'll hold off on using one of them until the software settles down a bit. Thanks again for this utility.

LG L246WP Resounding Success!

I've spent several hours (and a couple of dollars) trying to fix this problem under Arch Linux. While the newest Windows 7 drivers seem not to have this issue, the current Nvidia drivers do. I used the Nvidia driver to save the EDID and run your utility upon the file, and after setting up the xorg.conf.d/30-display.conf file to have load the custom EDID I was good to go.

Thanks!

P.S. Driver Version was 275.09.07

Success on a Sceptre 32"!

Thank you Tim!!!

This helped fix the display on a Sceptre X32BV-FullHD 32" 1080P television running Fedora 13.

I decided to use the --todvi command line switch. The TV works quite well on Radeon cards but overscans and looks terrible on Nvidia, whether windows or linux. I even bought one of those hardware EDID memories to sit between computer and monitor but still no luck. Thanks for the link to the nvidia.com forums describing how to do this on Windows, too.

Thanks again for providing this solution and writing some interesting articles too. That TCP over DNS concept is fascinating stuff. You are a 1st class hacker to conceive of tunnelling anything over DNS.

Best,

stimoceiver

Thank you, thank you, thank

Thank you, thank you, thank you! I've been struggling with this for over a month; my GeForce 8800 GTS always saw my 42" Sceptre HDTV as a DVI monitor, but after upgrading my PC to Sandy Bridge/i7 2600k, the 8800 started flaking out and randomly hard freezing X when it would switch power modes, likely due to too much drain on the power supply. I bought a new power supply and a 560Ti to replace the 8800, but low and behold I couldn't do anything in my power to make Windows 7 or Ubuntu see the TV as a monitor, and everything came out all blurry, overscanned, and horrible. I even purchased a DVI doctor from monoprice tonight before reading this article. I am going to try to cancel my order first thing tomorrow.

After running your fix on Ubuntu, and the associated fix for Windows linked from the comments below, I am no longer guessing from memory where my applications, places, and system menus are in the overscan area, and everything looks like it should. I guess I was googling wrong to not come across this earlier; I kept looking for "force hdmi to dvi" and this thread never came across until I looked for "nvidia edid fix", for which it is the number one hit.

Thanks again!

Comments

.......

_,I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well. In fact your creative writing abilities has inspired me to start my own blog now.

Native Resolution

You will always get the best picture when you run at the native resolution of the tv/monitor. You cannot run a 720p device at 1080p, it forces down sampling somewhere. If it looks really bad then its probably the TV downsampling it poorly.

Unfortunately this is a different problem than the intended purpose of this tool and no amount of EDID fiddling will fix it.

Phoenix EDID

The phoenix editor is super outdated and as far as I know cannot write to the EDID rom. You probably should only use it for reading/examining EDID.

Awesome

I'm thrilled that this little utility is still helping people. Would you be so kind as to post the exact model number of the Sceptre HDTV?

Also I'd like to mention that I believe there is now a better way of doing it in Windows. It involves "creating" a video driver for your monitor so you don't have to update your registry every time a new video driver comes out. I havn't done this myself, but I just want you to know that this may be easier in the long run.

Not really

But I've had some success by changing from DFP-1 to DFP-0. (Make sure to move the dvi cable too maybe)

Any Solution to keep HDMI-audio extension?

Hi,thanks for your small tool - it helped. But my problem is that this solution wipes the whole extension block - but i want to use the hdmi audio :(So, do you know a solution fixing the identification of the device without deleting the whole extension block, maybe change one flag in the edid? (disable the overscan/underscan feature or something like this?)Here's all the Information of my TV(LG 42LH3010) from switchresx, including the edid in hex and in textmode:http://www.mediafire.com/file/mimzmz1lh2m/LG TV 

Tough Problem

hmm that sucks.

the audio information is included in the extension block, so yeah that is a problem. i might dabble with it but dont expect anything from me, particularly beacause i have no way to test it.

Much Appreciated!

I have been tearing my hair out ever since I updated my myth box from Fedora 8 to Fedora 10.  Somewhere along the way, nvidia started using edid to scan my TV and it was setting up 1280x720.  The max resolution for my TV when connected to a PC should only have been 1024x768.  I followed your instructions here and got a perfect picture without the overscan.

Thanks!

Thanks!

You, sir, are brilliant. :) my monitor works lovely now.

Help me please..

I have a Samsung LN-S4092D and i'm trying to get resolution 1920x1080 without the overscan on my Debian Lenny amd64! I don't understand your directions, especially the part about running your utility....Help me please, i've saved the edid.bin file in my Misc folder. How do i use your utility to fix the overscan problem?

My assumption

I assume you are having difficulty compiling the program. I have built a static version of the program, and have included it here.

You need to do something like:

wget http://analogbit.com/sites/default/files/edid_disable_exts_amd64_static.tgz
tar xzvf edid_disable_exts_amd64_static.tgz
./edid_disable_exts_amd64_static /path/to/your/edid.input /path/to/your/edid.output

Overscan solution...

I did as u suggested, let me illustrate...

el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ sudo ./edid* /home/el1ip3s01d/Desktop/Misc/
ERROR: Input EDID does not appear to be valid.

Here it is again!!!

el1ip3s01d@Iehovah-007:~/Desktop$ sudo ./edid_* edid.bin Samsung.dat
sudo: ./edid_*: command not found
My God, what am i doing wrong???

el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ cd edid_*
bash: cd: edid_disable_exts_amd64_static: Not a directory
el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ sudo ./edid_* /home/el1p3s01d/Desktop/edid.bin /home/el1ip3s01d/Desktop/Misc/Samsung.dat
Usage: ./edid_disable_exts_amd64_static [input_file] [output_file]
el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ sudo ./static* /home/el1p3s01d/Desktop/edid.bin /home/el1ip3s01d/Desktop/Misc/Samsung.dat
sudo: ./static*: command not found
el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ ./edid_* /home/el1p3s01d/Desktop/edid.bin /home/el1ip3s01d/Desktop/Misc/Samsung.dat
Usage: ./edid_disable_exts_amd64_static [input_file] [output_file]
el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ ./edid_* [/home/el1p3s01d/Desktop/edid.bin] [/home/el1ip3s01d/Desktop/Misc/Samsung.da]t
Usage: ./edid_disable_exts_amd64_static [input_file] [output_file]
el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ sudo ./edid_* [/home/el1p3s01d/Desktop/edid.bin] [/home/el1ip3s01d/Desktop/Misc/Samsung.da]t
Usage: ./edid_disable_exts_amd64_static [input_file] [output_file]
el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ sudo ./edid_* [edid.bin] [Samsung.dat]
Usage: ./edid_disable_exts_amd64_static [input_file] [output_file]

Look, at what happended now?

el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ ls
AdobeReader_enu-8.1.3-1.i386.deb           compizconfig-python-0.7.6.tar.gz                      glib-2.7.1.tar.gz
atk-1.0.0.tar.gz                           compiz-fusion-plugins-extra-0.7.6-cmake.tar.gz        gspcav1-20071224.tar.gz
atk_1.24.0-1_win32.zip                     compiz-fusion-plugins-extra-0.7.6.tar.gz              gtk+-2.8.0.tar.gz
atk-1.24.0.tar.bz2                         compiz-fusion-plugins-main-0.7.6-cmake.tar.gz         index.pdf
atk-dev_1.24.0-1_win32.zip                 compiz-fusion-plugins-main-0.7.6.tar.gz               lexmark
cairo-java-1.0.1.tar.gz                    compiz-fusion-plugins-unsupported-0.7.6-cmake.tar.gz  libcompizconfig-0.7.6.tar.gz
ccsm-0.7.6.tar.gz                          compiz-fusion-plugins-unsupported-0.7.6.tar.gz        NVIDIA-Linux-x86_64-180.22-pkg2.run
CJLZ35LE-CUPS-2.0-1.TAR.GZ                 compiz-switch-0.4.0~source.tar.gz                     pango-1.0.0.tar.gz
compiz-0.7.6.tar.gz                        diveintopython-pdf-5.4.zip                            perl-5.10.0
compiz-check                               edid_disable_exts_amd64_static                        perl-5.10.0.tar.gz
compizconfig-backend-gconf-0.7.6.tar.gz    edid_disable_exts_amd64_static.tgz                    simple-ccsm-0.7.6.tar.gz
compizconfig-backend-kconfig-0.7.6.tar.gz  emerald-0.7.6.tar.gz                                  uvcvideo-r104.tar.gz
el1ip3s01d@Iehovah-007:~/Desktop/Downloads$ sudo ./edid_disable_exts_amd64_static [/home/el1ip3s01d/Desktop/edid.bin] [/home/el1ip3s01d/Desktop/Misc/Samsung.dat]
ERROR: Input file "[/home/el1ip3s01d/Desktop/edid.bin]" could not be opened.

You came close

You almost got it.

When you said "My god what am i doing wrong?" you were in the wrong directory. You have to take note of which directory you are currently in and what directory the file is in.

Also your later attempts would have worked if you didnt put brackets around the file names.  The file names do not need brackets.

 

Hello again...

where did i go wrong?

Section "Device"
Identifier     "Device0"
Driver         "nvidia"
VendorName     "NVIDIA Corporation"
Option         "CustomEDID"  "DFP-1:/etc/X11/LN-S4092D-modified.edid"
EndSection

This is confusing?

I'll explain, what would my output be?

./edid_disable_exts_amd64_static /path/to/your/edid.input /path/to/your/edid.output

Tim...

What would my output be? Do you mean that i have to create a output file? And if so, how would i do that?

Output

The program only writes to the screen if there is an error, if everything is successful there should be no message.

The 1st parameter is the EDID input file, the 2nd parameter is the EDID output file. The output file is created by the program.

Will this work with Windows Vista Drivers?

I just acquired 3 Westinghouse L2610NM monitors (1920x1200 native) which I seek to run on nVIDIA 8800 GPUs with Windows Vista.  The EDID in this model monitor appears to report the monitor as a 1080p HDTV.  The nVIDIA Forceware shows HDTV, and everything works well at 1920x1080, except for the considerable 120 lines of overscan distortion.  At 1920x1200 the text is choppy, motly, barely readable hieroglyphics.  It appears that your fix applies to Linux.  Do you think it will work with Vista?

edid

EDID fix for L2610NM in Windows

Yes and no.

The same method works, but you must do it differently. I found a method that I tested and it does work.

http://forums.nvidia.com/index.php?showtopic=58483&st=0&p=330319&#entry330319

Try that out.