[Intel-gfx] [PATCH] drm/i915: Fix the HDMI hot plug disconnection failure

Chris Chiu chiu at endlessm.com
Wed Oct 3 09:22:57 UTC 2018


It works on my problematic laptops. Verified on X530UN and X560UD.
On Wed, Oct 3, 2018 at 1:23 PM Guang Bai <guang.bai at intel.com> wrote:
>
> On some platforms, slowly unplugging (wiggling) the HDMI cable makes
> the kernel to believe the HDMI display still connected. This is because
> the HDMI DDC lines are disconnected sometimes later after the hot-plug
> interrupt triggered. Use the hot plug live states to honor HDMI hot plug
> status in addtion to access the DDC channels.
>
> Cc: Jani Nikula <jani.nikula at intel.com>
> Cc: Chris Chiu <chiu at endlessm.com>
> Signed-off-by: Guang Bai <guang.bai at intel.com>
> ---
>  drivers/gpu/drm/i915/intel_hotplug.c | 31 ++++++++++++++++++++++++++++---
>  1 file changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c
> index 648a13c..db6288f 100644
> --- a/drivers/gpu/drm/i915/intel_hotplug.c
> +++ b/drivers/gpu/drm/i915/intel_hotplug.c
> @@ -246,17 +246,42 @@ static void intel_hpd_irq_storm_reenable_work(struct work_struct *work)
>         intel_runtime_pm_put(dev_priv);
>  }
>
> +#define MAX_SHORT_PULSE_MS     100
> +#define PORT_CHECK_LOOP_COUNT  3
> +
>  bool intel_encoder_hotplug(struct intel_encoder *encoder,
>                            struct intel_connector *connector)
>  {
>         struct drm_device *dev = connector->base.dev;
> -       enum drm_connector_status old_status;
> +       enum drm_connector_status old_status, new_status;
> +       enum hpd_pin pin = encoder->hpd_pin;
> +       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> +       u32 count = 0;
>
>         WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
>         old_status = connector->base.status;
>
> -       connector->base.status =
> -               drm_helper_probe_detect(&connector->base, NULL, false);
> +       /*
> +        * Set HDMI connection status based on hot-plug live states and
> +        * display probe results.
> +        */
> +       if ((encoder->type == INTEL_OUTPUT_HDMI ||
> +            encoder->type == INTEL_OUTPUT_DDI) &&
> +           dev_priv->hotplug.stats[pin].state == HPD_ENABLED) {
> +               do {
> +                       new_status = connector_status_disconnected;
> +                       msleep(MAX_SHORT_PULSE_MS);
> +
> +                       if (intel_digital_port_connected(encoder))
> +                               new_status = drm_helper_probe_detect(&connector->base,
> +                                                                    NULL, false);
> +                       if (new_status == connector_status_connected)
> +                               break;
> +               } while (++count <= PORT_CHECK_LOOP_COUNT);
> +               connector->base.status = new_status;
> +       } else
> +               connector->base.status =
> +                       drm_helper_probe_detect(&connector->base, NULL, false);
>
>         if (old_status == connector->base.status)
>                 return false;
> --
> 2.7.4
>


More information about the Intel-gfx mailing list