diff -urp linux-4.14.11.orig/drivers/gpu/drm/i915/i915_drv.c linux-4.14.11/drivers/gpu/drm/i915/i915_drv.c --- linux-4.14.11.orig/drivers/gpu/drm/i915/i915_drv.c 2018-01-02 20:31:17.000000000 +0100 +++ linux-4.14.11/drivers/gpu/drm/i915/i915_drv.c 2018-01-03 18:58:29.107848254 +0100 @@ -2550,8 +2550,10 @@ static int intel_runtime_suspend(struct assert_forcewakes_inactive(dev_priv); + /* if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) intel_hpd_poll_init(dev_priv); + */ DRM_DEBUG_KMS("Device suspended\n"); return 0; diff -urp linux-4.14.11.orig/drivers/gpu/drm/i915/intel_crt.c linux-4.14.11/drivers/gpu/drm/i915/intel_crt.c --- linux-4.14.11.orig/drivers/gpu/drm/i915/intel_crt.c 2018-01-02 20:31:17.000000000 +0100 +++ linux-4.14.11/drivers/gpu/drm/i915/intel_crt.c 2018-01-03 18:54:59.632505398 +0100 @@ -370,7 +370,7 @@ static bool valleyview_crt_detect_hotplu * * Just disable HPD interrupts here to prevent this */ - reenable_hpd = intel_hpd_disable(dev_priv, crt->base.hpd_pin); + //reenable_hpd = intel_hpd_disable(dev_priv, crt->base.hpd_pin); save_adpa = adpa = I915_READ(crt->adpa_reg); DRM_DEBUG_KMS("trigger hotplug detect cycle: adpa=0x%x\n", adpa); @@ -396,8 +396,7 @@ static bool valleyview_crt_detect_hotplu DRM_DEBUG_KMS("valleyview hotplug adpa=0x%x, result %d\n", adpa, ret); - if (reenable_hpd) - intel_hpd_enable(dev_priv, crt->base.hpd_pin); + //if (reenable_hpd) intel_hpd_enable(dev_priv, crt->base.hpd_pin); return ret; } diff -urp linux-4.14.11.orig/drivers/gpu/drm/i915/intel_hotplug.c linux-4.14.11/drivers/gpu/drm/i915/intel_hotplug.c --- linux-4.14.11.orig/drivers/gpu/drm/i915/intel_hotplug.c 2018-01-02 20:31:17.000000000 +0100 +++ linux-4.14.11/drivers/gpu/drm/i915/intel_hotplug.c 2018-01-03 20:46:36.347231580 +0100 @@ -498,6 +498,10 @@ void intel_hpd_irq_handler(struct drm_i9 */ void intel_hpd_init(struct drm_i915_private *dev_priv) { + struct drm_device *dev = &dev_priv->drm; + struct drm_mode_config *mode_config = &dev->mode_config; + struct drm_connector *connector; + int i; for_each_hpd_pin(i) { @@ -505,8 +509,29 @@ void intel_hpd_init(struct drm_i915_priv dev_priv->hotplug.stats[i].state = HPD_ENABLED; } - WRITE_ONCE(dev_priv->hotplug.poll_enabled, false); - schedule_work(&dev_priv->hotplug.poll_init_work); + + //WRITE_ONCE(dev_priv->hotplug.poll_enabled, false); + //schedule_work(&dev_priv->hotplug.poll_init_work); + + list_for_each_entry(connector, &mode_config->connector_list, head) { + struct intel_connector *intel_connector = + to_intel_connector(connector); + connector->polled = intel_connector->polled; + + /* MST has a dynamic intel_connector->encoder and it's reprobing + * is all handled by the MST helpers. */ + if (intel_connector->mst_port) + continue; + + if (!connector->polled && I915_HAS_HOTPLUG(dev_priv) && + intel_connector->encoder->hpd_pin > HPD_NONE) { + connector->polled = DRM_CONNECTOR_POLL_HPD; + //connector->polled = enabled ? + // DRM_CONNECTOR_POLL_CONNECT | + // DRM_CONNECTOR_POLL_DISCONNECT : + // DRM_CONNECTOR_POLL_HPD; + } + } /* * Interrupt setup is already guaranteed to be single-threaded, this is @@ -547,10 +572,11 @@ static void i915_hpd_poll_init_work(stru if (!connector->polled && I915_HAS_HOTPLUG(dev_priv) && intel_connector->encoder->hpd_pin > HPD_NONE) { - connector->polled = enabled ? - DRM_CONNECTOR_POLL_CONNECT | - DRM_CONNECTOR_POLL_DISCONNECT : - DRM_CONNECTOR_POLL_HPD; + connector->polled = DRM_CONNECTOR_POLL_HPD; + //connector->polled = enabled ? + // DRM_CONNECTOR_POLL_CONNECT | + // DRM_CONNECTOR_POLL_DISCONNECT : + // DRM_CONNECTOR_POLL_HPD; } } drm_connector_list_iter_end(&conn_iter); @@ -601,7 +627,7 @@ void intel_hpd_init_work(struct drm_i915 { INIT_WORK(&dev_priv->hotplug.hotplug_work, i915_hotplug_work_func); INIT_WORK(&dev_priv->hotplug.dig_port_work, i915_digport_work_func); - INIT_WORK(&dev_priv->hotplug.poll_init_work, i915_hpd_poll_init_work); + //INIT_WORK(&dev_priv->hotplug.poll_init_work, i915_hpd_poll_init_work); INIT_DELAYED_WORK(&dev_priv->hotplug.reenable_work, intel_hpd_irq_storm_reenable_work); } @@ -618,7 +644,7 @@ void intel_hpd_cancel_work(struct drm_i9 cancel_work_sync(&dev_priv->hotplug.dig_port_work); cancel_work_sync(&dev_priv->hotplug.hotplug_work); - cancel_work_sync(&dev_priv->hotplug.poll_init_work); + //cancel_work_sync(&dev_priv->hotplug.poll_init_work); cancel_delayed_work_sync(&dev_priv->hotplug.reenable_work); } diff -urp linux-4.14.11.orig/drivers/gpu/drm/i915/intel_runtime_pm.c linux-4.14.11/drivers/gpu/drm/i915/intel_runtime_pm.c --- linux-4.14.11.orig/drivers/gpu/drm/i915/intel_runtime_pm.c 2018-01-02 20:31:17.000000000 +0100 +++ linux-4.14.11/drivers/gpu/drm/i915/intel_runtime_pm.c 2018-01-03 19:07:58.353255066 +0100 @@ -945,8 +945,10 @@ static void vlv_display_power_well_deini intel_power_sequencer_reset(dev_priv); /* Prevent us from re-enabling polling on accident in late suspend */ + /* if (!dev_priv->drm.dev->power.is_suspended) intel_hpd_poll_init(dev_priv); + */ } static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv,