Start E-EDID support in the DDC module.
Since there's no way to safely know how many blocks xf86DoEDID_DDC2 would return, add a new xf86DoEEDID entrypoint to do that, and implement the one in terms of the other.
This commit is contained in:
		
							parent
							
								
									b5f98fcea2
								
							
						
					
					
						commit
						88ece11d6c
					
				| 
						 | 
				
			
			@ -2,6 +2,14 @@
 | 
			
		|||
 * 
 | 
			
		||||
 * Copyright 1998,1999 by Egbert Eich <Egbert.Eich@Physik.TU-Darmstadt.DE>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Note that DDC1 does not define any method for returning blocks beyond
 | 
			
		||||
 * the first.  DDC2 does, but the original implementation would only ever
 | 
			
		||||
 * read the first block.  If you want to read and parse all blocks, use
 | 
			
		||||
 * xf86DoEEDID().
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_XORG_CONFIG_H
 | 
			
		||||
#include <xorg-config.h>
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -31,11 +39,6 @@ static unsigned int *FetchEDID_DDC1(
 | 
			
		|||
    register unsigned int (*)(ScrnInfoPtr)
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
static unsigned char* EDID1Read_DDC2(
 | 
			
		||||
    int scrnIndex, 
 | 
			
		||||
    I2CBusPtr pBus
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
static unsigned char * DDCRead_DDC2(
 | 
			
		||||
    int scrnIndex,
 | 
			
		||||
    I2CBusPtr pBus, 
 | 
			
		||||
| 
						 | 
				
			
			@ -107,6 +110,59 @@ xf86DoEDID_DDC1(
 | 
			
		|||
	return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Attempts to probe the monitor for EDID information, if NoDDC and NoDDC2 are
 | 
			
		||||
 * unset.  EDID information blocks are interpreted and the results returned in
 | 
			
		||||
 * an xf86MonPtr.  Unlike xf86DoEDID_DDC[12](), this function will return
 | 
			
		||||
 * the complete EDID data, including all extension blocks.
 | 
			
		||||
 *
 | 
			
		||||
 * This function does not affect the list of modes used by drivers -- it is up
 | 
			
		||||
 * to the driver to decide policy on what to do with EDID information.
 | 
			
		||||
 *
 | 
			
		||||
 * @return pointer to a new xf86MonPtr containing the EDID information.
 | 
			
		||||
 * @return NULL if no monitor attached or failure to interpret the EDID.
 | 
			
		||||
 *
 | 
			
		||||
 * nblocks is an in/out parameter.  If non-zero, it defines the number of
 | 
			
		||||
 * blocks to read from the monitor; zero (or NULL pointer) means read all.
 | 
			
		||||
 * If non-NULL, on return it will be filled in with the number of blocks
 | 
			
		||||
 * read.
 | 
			
		||||
 */
 | 
			
		||||
xf86MonPtr
 | 
			
		||||
xf86DoEEDID(int scrnIndex, I2CBusPtr pBus, int *nblocks)
 | 
			
		||||
{
 | 
			
		||||
    ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
 | 
			
		||||
    unsigned char *EDID_block = NULL;
 | 
			
		||||
    xf86MonPtr tmp = NULL;
 | 
			
		||||
    /* Default DDC and DDC2 to enabled. */
 | 
			
		||||
    Bool noddc = FALSE, noddc2 = FALSE;
 | 
			
		||||
    OptionInfoPtr options;
 | 
			
		||||
 | 
			
		||||
    options = xnfalloc(sizeof(DDCOptions));
 | 
			
		||||
    memcpy(options, DDCOptions, sizeof(DDCOptions));
 | 
			
		||||
    xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
 | 
			
		||||
 | 
			
		||||
    xf86GetOptValBool(options, DDCOPT_NODDC, &noddc);
 | 
			
		||||
    xf86GetOptValBool(options, DDCOPT_NODDC2, &noddc2);
 | 
			
		||||
    xfree(options);
 | 
			
		||||
    
 | 
			
		||||
    if (noddc || noddc2)
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
    EDID_block = DDCRead_DDC2(scrnIndex, pBus, 0, EDID1_LEN);
 | 
			
		||||
 | 
			
		||||
    if (EDID_block)
 | 
			
		||||
	tmp = xf86InterpretEDID(scrnIndex, EDID_block);
 | 
			
		||||
 | 
			
		||||
    if (nblocks) {
 | 
			
		||||
	if (tmp)
 | 
			
		||||
	    *nblocks = tmp->no_sections;
 | 
			
		||||
	else
 | 
			
		||||
	    *nblocks = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Attempts to probe the monitor for EDID information, if NoDDC and NoDDC2 are
 | 
			
		||||
 * unset.  EDID information blocks are interpreted and the results returned in
 | 
			
		||||
| 
						 | 
				
			
			@ -121,42 +177,8 @@ xf86DoEDID_DDC1(
 | 
			
		|||
xf86MonPtr
 | 
			
		||||
xf86DoEDID_DDC2(int scrnIndex, I2CBusPtr pBus)
 | 
			
		||||
{
 | 
			
		||||
    ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
 | 
			
		||||
    unsigned char *EDID_block = NULL;
 | 
			
		||||
    xf86MonPtr tmp = NULL;
 | 
			
		||||
    /* Default DDC and DDC2 to enabled. */
 | 
			
		||||
    Bool noddc = FALSE, noddc2 = FALSE;
 | 
			
		||||
    OptionInfoPtr options;
 | 
			
		||||
 | 
			
		||||
    options = xnfalloc(sizeof(DDCOptions));
 | 
			
		||||
    (void)memcpy(options, DDCOptions, sizeof(DDCOptions));
 | 
			
		||||
    xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
 | 
			
		||||
 | 
			
		||||
    xf86GetOptValBool(options, DDCOPT_NODDC, &noddc);
 | 
			
		||||
    xf86GetOptValBool(options, DDCOPT_NODDC2, &noddc2);
 | 
			
		||||
    xfree(options);
 | 
			
		||||
    
 | 
			
		||||
    if (noddc || noddc2)
 | 
			
		||||
	return NULL;
 | 
			
		||||
 | 
			
		||||
    EDID_block = EDID1Read_DDC2(scrnIndex,pBus);
 | 
			
		||||
 | 
			
		||||
    if (EDID_block){
 | 
			
		||||
	tmp = xf86InterpretEDID(scrnIndex,EDID_block);
 | 
			
		||||
    } else {
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	ErrorF("No EDID block returned\n");
 | 
			
		||||
#endif
 | 
			
		||||
	return NULL;
 | 
			
		||||
    }
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
    if (!tmp)
 | 
			
		||||
	ErrorF("Cannot interpret EDID block\n");
 | 
			
		||||
    else
 | 
			
		||||
        ErrorF("Sections to follow: %i\n",tmp->no_sections);
 | 
			
		||||
#endif
 | 
			
		||||
    
 | 
			
		||||
    return tmp;
 | 
			
		||||
    int nblocks = 1;
 | 
			
		||||
    return xf86DoEEDID(scrnIndex, pBus, &nblocks);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
| 
						 | 
				
			
			@ -226,12 +248,6 @@ FetchEDID_DDC1(register ScrnInfoPtr pScrn,
 | 
			
		|||
    return (ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned char*
 | 
			
		||||
EDID1Read_DDC2(int scrnIndex, I2CBusPtr pBus)
 | 
			
		||||
{
 | 
			
		||||
    return  DDCRead_DDC2(scrnIndex, pBus, 0, EDID1_LEN);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned char *
 | 
			
		||||
DDCRead_DDC2(int scrnIndex, I2CBusPtr pBus, int start, int len)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,6 +35,8 @@ extern xf86MonPtr xf86DoEDID_DDC2(
 | 
			
		|||
   I2CBusPtr pBus
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
extern xf86MonPtr xf86DoEEDID(int scrnIndex, I2CBusPtr pBus, int *nblocks);
 | 
			
		||||
 | 
			
		||||
extern xf86MonPtr xf86PrintEDID(
 | 
			
		||||
    xf86MonPtr monPtr
 | 
			
		||||
);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue