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.
This commit is contained in:
		
							parent
							
								
									7939c8dfb7
								
							
						
					
					
						commit
						71a15a7d57
					
				|  | @ -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; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue