diff options
author | Adam Jackson <ajax@benzedrine.nwnk.net> | 2006-09-14 19:00:10 -0400 |
---|---|---|
committer | Adam Jackson <ajax@benzedrine.nwnk.net> | 2006-09-14 19:00:10 -0400 |
commit | 71a15a7d5721073eccb3a275f353b3aa584c0d68 (patch) | |
tree | d253a624fa2aab4c1aa825646d248e75c012e94a | |
parent | 7939c8dfb7c7bed4febcdc12922fb2e17619ea36 (diff) |
Publish the raw EDID block as a property on the root window.
This was removed in the patch for bug #5386, but is still useful.
-rw-r--r-- | hw/xfree86/ddc/ddcProperty.c | 91 |
1 files changed, 88 insertions, 3 deletions
diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c index c76afbc02..59873fafd 100644 --- a/hw/xfree86/ddc/ddcProperty.c +++ b/hw/xfree86/ddc/ddcProperty.c @@ -27,6 +27,10 @@ #include "xf86.h" #include "xf86DDC.h" +#include <X11/Xatom.h> +#include "property.h" +#include "propertyst.h" +#include "xf86DDC.h" /* * xf86Mode.c should have a some more DisplayModePtr list handling. @@ -407,9 +411,88 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC) } } -/* - * Empty shell that keeps most drivers happy. - */ +#define EDID1_ATOM_NAME "XFree86_DDC_EDID1_RAWDATA" +#define EDID2_ATOM_NAME "XFree86_DDC_EDID2_RAWDATA" +#define VDIF_ATOM_NAME "XFree86_DDC_VDIF_RAWDATA" + +static void +addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC) +{ + Atom EDID1Atom=-1, EDID2Atom=-1; + CARD8 *EDID1rawdata = NULL; + CARD8 *EDID2rawdata = NULL; + int i, scrnIndex = pScrn->scrnIndex; + Bool makeEDID1prop = FALSE; + Bool makeEDID2prop = FALSE; + + if (DDC->ver.version == 1) { + makeEDID1prop = TRUE; + } else if (DDC->ver.version == 2) { + int checksum1; + int checksum2; + makeEDID2prop = TRUE; + + /* Some monitors (eg Panasonic PanaSync4) + * report version==2 because they used EDID v2 spec document, + * although they use EDID v1 data structure :-( + * + * Try using checksum to determine when we have such a monitor. + */ + checksum2 = 0; + for (i = 0; i < 256; i++) + checksum2 += DDC->rawData[i]; + if (checksum2 % 256) { + xf86DrvMsg(scrnIndex, X_INFO, "Monitor EDID v2 checksum failed\n"); + xf86DrvMsg(scrnIndex, X_INFO, + "XFree86_DDC_EDID2_RAWDATA property may be bad\n"); + checksum1 = 0; + for (i = 0; i < 128; i++) + checksum1 += DDC->rawData[i]; + if (!(checksum1 % 256)) { + xf86DrvMsg(scrnIndex, X_INFO, + "Monitor EDID v1 checksum passed,\n"); + xf86DrvMsg(scrnIndex, X_INFO, + "XFree86_DDC_EDID1_RAWDATA property created\n"); + makeEDID1prop = TRUE; + } + } + } else { + xf86DrvMsg(scrnIndex, X_PROBED, "unexpected EDID version %d.%d\n", + DDC->ver.version, DDC->ver.revision); + return; + } + + if (makeEDID1prop) { + if ((EDID1rawdata = xalloc(128*sizeof(CARD8)))==NULL) + return; + + EDID1Atom = MakeAtom(EDID1_ATOM_NAME, sizeof(EDID1_ATOM_NAME), TRUE); + memcpy(EDID1rawdata, DDC->rawData, 128); + xf86RegisterRootWindowProperty(scrnIndex, EDID1Atom, XA_INTEGER, 8, + 128, (unsigned char *)EDID1rawdata); + } + + if (makeEDID2prop) { + if ((EDID2rawdata = xalloc(256*sizeof(CARD8)))==NULL) + return; + + memcpy(EDID2rawdata, DDC->rawData, 256); + EDID2Atom = MakeAtom(EDID2_ATOM_NAME, sizeof(EDID2_ATOM_NAME), TRUE); + xf86RegisterRootWindowProperty(scrnIndex, EDID2Atom, XA_INTEGER, 8, + 256, (unsigned char *)EDID2rawdata); + } + +#if 0 + if (DDC->vdif) { +#define VDIF_DUMMY_STRING "setting dummy VDIF property - please insert correct values\n" + + VDIFAtom = MakeAtom(VDIF_ATOM_NAME, sizeof(VDIF_ATOM_NAME), TRUE); + xf86RegisterRootWindowProperty(scrnIndex, VDIFAtom, XA_STRING, 8, + strlen(VDIF_DUMMY_STRING), VDIF_DUMMY_STRING); + } +#endif +} + Bool xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC) { @@ -418,5 +501,7 @@ xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC) xf86DDCMonitorSet(pScrn->scrnIndex, pScrn->monitor, DDC); + addRootWindowProperties(pScrn, DDC); + return TRUE; } |