aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_irq.c
diff options
context:
space:
mode:
authorEgbert Eich <eich@suse.de>2013-04-16 07:36:55 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-04-18 03:43:29 -0400
commit821450c6938d9228d8569d54d5c369985b1cc8dd (patch)
tree36ea50f1694ef603d63717c3008f873e1768a353 /drivers/gpu/drm/i915/i915_irq.c
parentb543fb0464ddf30a5b554957fd212eb7a2acac65 (diff)
drm/i915: (re)init HPD interrupt storm statistics
When an encoder is shared on several connectors there is only one hotplug line, thus this line needs to be shared among these connectors. If HPD detect only works reliably on a subset of those connectors, we want to poll the others. Thus we need to make sure that storm detection doesn't mess up the settings for those connectors. Therefore we store the settings in the intel_connector struct and restore them from there. If nothing is set but the encoder has a hpd_pin set we assume this connector is hotplug capable. On init/reset we make sure the polled state of the connectors is (re)set to the default value, the HPD interrupts are marked enabled. Signed-off-by: Egbert Eich <eich@suse.de> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 5ac1291c5853..2b4967014dc6 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -596,6 +596,7 @@ static inline void hotplug_irq_storm_detect(struct drm_device *dev,
596 spin_lock_irqsave(&dev_priv->irq_lock, irqflags); 596 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
597 597
598 for (i = 1; i < HPD_NUM_PINS; i++) { 598 for (i = 1; i < HPD_NUM_PINS; i++) {
599
599 if (!(hpd[i] & hotplug_trigger) || 600 if (!(hpd[i] & hotplug_trigger) ||
600 dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED) 601 dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED)
601 continue; 602 continue;
@@ -3062,7 +3063,20 @@ void intel_irq_init(struct drm_device *dev)
3062void intel_hpd_init(struct drm_device *dev) 3063void intel_hpd_init(struct drm_device *dev)
3063{ 3064{
3064 struct drm_i915_private *dev_priv = dev->dev_private; 3065 struct drm_i915_private *dev_priv = dev->dev_private;
3066 struct drm_mode_config *mode_config = &dev->mode_config;
3067 struct drm_connector *connector;
3068 int i;
3065 3069
3070 for (i = 1; i < HPD_NUM_PINS; i++) {
3071 dev_priv->hpd_stats[i].hpd_cnt = 0;
3072 dev_priv->hpd_stats[i].hpd_mark = HPD_ENABLED;
3073 }
3074 list_for_each_entry(connector, &mode_config->connector_list, head) {
3075 struct intel_connector *intel_connector = to_intel_connector(connector);
3076 connector->polled = intel_connector->polled;
3077 if (!connector->polled && I915_HAS_HOTPLUG(dev) && intel_connector->encoder->hpd_pin > HPD_NONE)
3078 connector->polled = DRM_CONNECTOR_POLL_HPD;
3079 }
3066 if (dev_priv->display.hpd_irq_setup) 3080 if (dev_priv->display.hpd_irq_setup)
3067 dev_priv->display.hpd_irq_setup(dev); 3081 dev_priv->display.hpd_irq_setup(dev);
3068} 3082}