[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