[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