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 "xf86.h" | ||||||
| #include "xf86DDC.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. |  * xf86Mode.c should have a some more DisplayModePtr list handling. | ||||||
|  | @ -407,9 +411,88 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | #define EDID1_ATOM_NAME         "XFree86_DDC_EDID1_RAWDATA" | ||||||
|  * Empty shell that keeps most drivers happy. | #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 | Bool | ||||||
| xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC) | xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC) | ||||||
| { | { | ||||||
|  | @ -418,5 +501,7 @@ xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC) | ||||||
| 
 | 
 | ||||||
|     xf86DDCMonitorSet(pScrn->scrnIndex, pScrn->monitor, DDC); |     xf86DDCMonitorSet(pScrn->scrnIndex, pScrn->monitor, DDC); | ||||||
| 
 | 
 | ||||||
|  |     addRootWindowProperties(pScrn, DDC); | ||||||
|  | 
 | ||||||
|     return TRUE; |     return TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue