@ -5830,6 +5830,35 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
return ret ;
}
static bool intel_eld_uptodate ( struct drm_connector * connector ,
int reg_eldv , uint32_t bits_eldv ,
int reg_elda , uint32_t bits_elda ,
int reg_edid )
{
struct drm_i915_private * dev_priv = connector - > dev - > dev_private ;
uint8_t * eld = connector - > eld ;
uint32_t i ;
i = I915_READ ( reg_eldv ) ;
i & = bits_eldv ;
if ( ! eld [ 0 ] )
return ! i ;
if ( ! i )
return false ;
i = I915_READ ( reg_elda ) ;
i & = ~ bits_elda ;
I915_WRITE ( reg_elda , i ) ;
for ( i = 0 ; i < eld [ 2 ] ; i + + )
if ( I915_READ ( reg_edid ) ! = * ( ( uint32_t * ) eld + i ) )
return false ;
return true ;
}
static void g4x_write_eld ( struct drm_connector * connector ,
struct drm_crtc * crtc )
{
@ -5846,6 +5875,12 @@ static void g4x_write_eld(struct drm_connector *connector,
else
eldv = G4X_ELDV_DEVCTG ;
if ( intel_eld_uptodate ( connector ,
G4X_AUD_CNTL_ST , eldv ,
G4X_AUD_CNTL_ST , G4X_ELD_ADDR ,
G4X_HDMIW_HDMIEDID ) )
return ;
i = I915_READ ( G4X_AUD_CNTL_ST ) ;
i & = ~ ( eldv | G4X_ELD_ADDR ) ;
len = ( i > > 9 ) & 0x1f ; /* ELD buffer size */
@ -5905,6 +5940,17 @@ static void ironlake_write_eld(struct drm_connector *connector,
eldv = IBX_ELD_VALIDB < < ( ( i - 1 ) * 4 ) ;
}
if ( intel_pipe_has_type ( crtc , INTEL_OUTPUT_DISPLAYPORT ) ) {
DRM_DEBUG_DRIVER ( " ELD: DisplayPort detected \n " ) ;
eld [ 5 ] | = ( 1 < < 2 ) ; /* Conn_Type, 0x1 = DisplayPort */
}
if ( intel_eld_uptodate ( connector ,
aud_cntrl_st2 , eldv ,
aud_cntl_st , IBX_ELD_ADDRESS ,
hdmiw_hdmiedid ) )
return ;
i = I915_READ ( aud_cntrl_st2 ) ;
i & = ~ eldv ;
I915_WRITE ( aud_cntrl_st2 , i ) ;
@ -5912,11 +5958,6 @@ static void ironlake_write_eld(struct drm_connector *connector,
if ( ! eld [ 0 ] )
return ;
if ( intel_pipe_has_type ( crtc , INTEL_OUTPUT_DISPLAYPORT ) ) {
DRM_DEBUG_DRIVER ( " ELD: DisplayPort detected \n " ) ;
eld [ 5 ] | = ( 1 < < 2 ) ; /* Conn_Type, 0x1 = DisplayPort */
}
i = I915_READ ( aud_cntl_st ) ;
i & = ~ IBX_ELD_ADDRESS ;
I915_WRITE ( aud_cntl_st , i ) ;