drm/i915/vlv: Disable HPD in valleyview_crt_detect_hotplug()
One of the things preventing us from using polling is the fact that calling valleyview_crt_detect_hotplug() when there's a VGA cable connected results in sending another hotplug. With polling enabled when HPD is disabled, this results in a scenario like this: - We enable power wells and reset the ADPA - output_poll_exec does force probe on VGA, triggering a hpd - HPD handler waits for poll to unlock dev->mode_config.mutex - output_poll_exec shuts off the ADPA, unlocks dev->mode_config.mutex - HPD handler runs, resets ADPA and brings us back to the start This results in an endless irq storm getting sent from the ADPA whenever a VGA connector gets detected in the middle of polling. Somewhat based off of the "drm/i915: Disable CRT HPD around force trigger" patch Ville Syrjälä sent a while back Cc: stable@vger.kernel.org Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Lyude <cpaul@redhat.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Šī revīzija ir iekļauta:

revīziju iesūtīja
Daniel Vetter

vecāks
9504a89247
revīzija
b236d7c842
@@ -510,3 +510,30 @@ void intel_hpd_cancel_work(struct drm_i915_private *dev_priv)
|
||||
cancel_work_sync(&dev_priv->hotplug.hotplug_work);
|
||||
cancel_delayed_work_sync(&dev_priv->hotplug.reenable_work);
|
||||
}
|
||||
|
||||
bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (pin == HPD_NONE)
|
||||
return false;
|
||||
|
||||
spin_lock_irq(&dev_priv->irq_lock);
|
||||
if (dev_priv->hotplug.stats[pin].state == HPD_ENABLED) {
|
||||
dev_priv->hotplug.stats[pin].state = HPD_DISABLED;
|
||||
ret = true;
|
||||
}
|
||||
spin_unlock_irq(&dev_priv->irq_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin)
|
||||
{
|
||||
if (pin == HPD_NONE)
|
||||
return;
|
||||
|
||||
spin_lock_irq(&dev_priv->irq_lock);
|
||||
dev_priv->hotplug.stats[pin].state = HPD_ENABLED;
|
||||
spin_unlock_irq(&dev_priv->irq_lock);
|
||||
}
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user