[Nouveau] [Bug 34554] Nouveau seems to have corrupted my laptop screen's EDID info
bugzilla-daemon at freedesktop.org
bugzilla-daemon at freedesktop.org
Thu Apr 14 15:38:04 PDT 2011
https://bugs.freedesktop.org/show_bug.cgi?id=34554
--- Comment #15 from Andy Getz <suertreus at gmail.com> 2011-04-14 15:38:04 PDT ---
I have not figured out how this happened, or whether it is nouveau-related, but
I have developed a workaround which has successfully and completely restored
two of my affected monitors (the backlight on the third died, so I am waiting
until the replacement part arrives to tinker with it). Will the problem happen
again? Maybe so, but the resulting breakage is now sufficiently easy for me to
repair that I'm not too worried about it.
I was able to restore my monitors by reading the EDID [0] from the EEPROM [1]
in the monitor using DDC [2] / I2C [3][4] (using SMBus [5][6] commands), fixing
the corrupt bytes (which fortunately were only in the header and were therefore
easy to fix), and writing the corrected EDID back to the monitor's EEPROM. I
did this using a C program and the Linux I2C interfaces [7] exported by the
video driver (still nouveau in one case, radeon in the other). My program
requires inclusion of a header from the i2c-tools package [8]; I will attach a
copy along with the source for posterity's sake.
Compile the program with -std=gnu99 and at least -O due to inlined SMBus
functions. Invoke the program with no arguments or read the source (or strings
the binary) to see usage help. I recommend the following use, which also
invokes parse-edid from the read-edid package [9]:
# Find the right i2c device; reading one that's not DDC will probably give
ENODEV
edid-tool /dev/i2c-0 read > edid-bad
# If you don't get warnings here about either the header or checksum being bad,
# you probably have some other problem.
edid-tool /dev/i2c-0 fix < edid-bad > edid-fixed
parse-edid < edid-fixed
# parse-edid will read several of the display related fields out of the EDID
and
# generate an Xorg.conf Monitor section; CHECK IT TO MAKE SURE IT LOOKS SANE
# BEFORE YOU FLASH IT BACK TO YOUR MONITOR.
edid-tool /dev/i2c-0 write < edid-fixed
If there's something more seriously wrong with the EDID in your monitor's
EEPROM than a bad header or checksum, you will need to either go field by field
through the EDID standard and your monitor specifications, which hopefully you
have somewhere, and generate one, or find an identical or very similar monitor
elsewhere and capture its EDID. If you have a monitor with multiple inputs,
they likely have distinct EEPROMs; if so, and only one is corrupted, you might
well be able to capture the proper EDID from one and flash it to the other.
Please let me know if this works for you or if you suspect there are bugs in
the program.
[0] http://en.wikipedia.org/wiki/Extended_display_identification_data
[1] http://en.wikipedia.org/wiki/EEPROM
[2] http://en.wikipedia.org/wiki/Display_Data_Channel
[3] http://en.wikipedia.org/wiki/I2c
[4] linux/Documentation/i2c/i2c-protocol
[5] http://en.wikipedia.org/wiki/SMBus
[6] linux/Documentation/i2c/smbus-protocol
[7] linux/Documentation/i2c/dev-interface
[8] http://www.lm-sensors.org/wiki/I2CTools
[9] http://www.polypux.org/projects/read-edid/
--
Configure bugmail: https://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the Nouveau
mailing list