[Intel-gfx] [PATCH V3] drm/i915: hdmi detection according by reading edid

Ian Romanick idr at freedesktop.org
Thu Jul 16 18:54:10 CEST 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

ling.ma at intel.com wrote:
> According to investigations from windows team ,hw team,
> and our test results on all 4x platofrms available
> (gm45, g45b, q45, g45a, g45c, g41a, and g41), we find
> currently Hot plug live status and Hot plug interrupt
> detection are not reliable, sometime the results from
> the two approaches are contradicts. So we chose edid
> detection for hdmi output.
> 
> Signed-off-by: Ma Ling <ling.ma at intel.com>

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

> ---
> According to commenst from Eric and ZhenYu,
> we directly read whole edid and reserve PEG_BAND_GAP_DATA
> configureation for irq hotplug handler.
> 
>  drivers/gpu/drm/i915/intel_hdmi.c |   64 ++----------------------------------
>  1 files changed, 4 insertions(+), 60 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index 9e30daa..1842290 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -130,16 +130,17 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
>  }
>  
>  static enum drm_connector_status
> -intel_hdmi_edid_detect(struct drm_connector *connector)
> +intel_hdmi_detect(struct drm_connector *connector)
>  {
>  	struct intel_output *intel_output = to_intel_output(connector);
>  	struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
>  	struct edid *edid = NULL;
>  	enum drm_connector_status status = connector_status_disconnected;
>  
> +	hdmi_priv->has_hdmi_sink = false;
>  	edid = drm_get_edid(&intel_output->base,
>  			    intel_output->ddc_bus);
> -	hdmi_priv->has_hdmi_sink = false;
> +
>  	if (edid) {
>  		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
>  			status = connector_status_connected;
> @@ -148,65 +149,8 @@ intel_hdmi_edid_detect(struct drm_connector *connector)
>  		intel_output->base.display_info.raw_edid = NULL;
>  		kfree(edid);
>  	}
> -	return status;
> -}
> -
> -static enum drm_connector_status
> -igdng_hdmi_detect(struct drm_connector *connector)
> -{
> -	struct intel_output *intel_output = to_intel_output(connector);
> -	struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
> -
> -	/* FIXME hotplug detect */
> -
> -	hdmi_priv->has_hdmi_sink = false;
> -	return intel_hdmi_edid_detect(connector);
> -}
>  
> -static enum drm_connector_status
> -intel_hdmi_detect(struct drm_connector *connector)
> -{
> -	struct drm_device *dev = connector->dev;
> -	struct drm_i915_private *dev_priv = dev->dev_private;
> -	struct intel_output *intel_output = to_intel_output(connector);
> -	struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
> -	u32 temp, bit;
> -
> -	if (IS_IGDNG(dev))
> -		return igdng_hdmi_detect(connector);
> -
> -	temp = I915_READ(PORT_HOTPLUG_EN);
> -
> -	switch (hdmi_priv->sdvox_reg) {
> -	case SDVOB:
> -		temp |= HDMIB_HOTPLUG_INT_EN;
> -		break;
> -	case SDVOC:
> -		temp |= HDMIC_HOTPLUG_INT_EN;
> -		break;
> -	default:
> -		return connector_status_unknown;
> -	}
> -
> -	I915_WRITE(PORT_HOTPLUG_EN, temp);
> -
> -	POSTING_READ(PORT_HOTPLUG_EN);
> -
> -	switch (hdmi_priv->sdvox_reg) {
> -	case SDVOB:
> -		bit = HDMIB_HOTPLUG_INT_STATUS;
> -		break;
> -	case SDVOC:
> -		bit = HDMIC_HOTPLUG_INT_STATUS;
> -		break;
> -	default:
> -		return connector_status_unknown;
> -	}
> -
> -	if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0)
> -		return intel_hdmi_edid_detect(connector);
> -	else
> -		return connector_status_disconnected;
> +	return status;
>  }
>  
>  static int intel_hdmi_get_modes(struct drm_connector *connector)

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkpfWzAACgkQX1gOwKyEAw82FACdHuOa9U1YVvFg5pFOXWEJUylB
4rQAnjbWRQH+Bs/jQ2hh2kkmIYsq1BV0
=ZksH
-----END PGP SIGNATURE-----



More information about the Intel-gfx mailing list