]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: fix the SDE irq dmesg warnings properly
authorJani Nikula <jani.nikula@intel.com>
Wed, 25 Nov 2015 14:47:22 +0000 (16:47 +0200)
committerJani Nikula <jani.nikula@intel.com>
Thu, 26 Nov 2015 14:30:46 +0000 (16:30 +0200)
We had the "The master control interrupt lied (SDE)!" check and error
message in place for a long time without any problems, until

commit 947a6b69ffc4221fbe115e0cd0dee41d153cdc6a
Author: Sonika Jindal <sonika.jindal@intel.com>
Date:   Wed Jul 8 17:07:47 2015 +0530

    drm/i915: Handle HPD when it has actually occurred

caused the errors to start happening. This was bisected and reported,
but the error message was silenced in

commit b04c91ecfbed914be0be841cced8d2fa6c50adf4
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date:   Fri Oct 23 10:56:12 2015 +0200

    drm/i915: shut up gen8+ SDE irq dmesg noise

shooting the messenger while the debugging for why Sonika's commit
triggered the errors was still in progress.

It looks like we need to read and acknowledge the PCH_PORT_HOTPLUG
register even though the hotplug trigger indicates there isn't a hotplug
irq to handle. The PCH doesn't seem to really ack the the interrupt to
the CPU unless we touch the hotplug register.

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Sonika Jindal <sonika.jindal@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92084
Fixes: 947a6b69ffc4 ("drm/i915: Handle HPD when it has actually occurred")
[Jani: added a comment and amended the commit message while applying]
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1448462843-32739-1-git-send-email-jani.nikula@intel.com
drivers/gpu/drm/i915/i915_irq.c

index c8ba94968aaf4ed259fe757af8768ff1d03bd3a2..671f76ccd8df6ed02287d5b5dd2d011460fe5698 100644 (file)
@@ -1824,8 +1824,24 @@ static void ibx_hpd_irq_handler(struct drm_device *dev, u32 hotplug_trigger,
        struct drm_i915_private *dev_priv = to_i915(dev);
        u32 dig_hotplug_reg, pin_mask = 0, long_mask = 0;
 
+       /*
+        * Somehow the PCH doesn't seem to really ack the interrupt to the CPU
+        * unless we touch the hotplug register, even if hotplug_trigger is
+        * zero. Not acking leads to "The master control interrupt lied (SDE)!"
+        * errors.
+        */
        dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
+       if (!hotplug_trigger) {
+               u32 mask = PORTA_HOTPLUG_STATUS_MASK |
+                       PORTD_HOTPLUG_STATUS_MASK |
+                       PORTC_HOTPLUG_STATUS_MASK |
+                       PORTB_HOTPLUG_STATUS_MASK;
+               dig_hotplug_reg &= ~mask;
+       }
+
        I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
+       if (!hotplug_trigger)
+               return;
 
        intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
                           dig_hotplug_reg, hpd,
@@ -1840,8 +1856,7 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir)
        int pipe;
        u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
 
-       if (hotplug_trigger)
-               ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx);
+       ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx);
 
        if (pch_iir & SDE_AUDIO_POWER_MASK) {
                int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK) >>
@@ -1934,8 +1949,7 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
        int pipe;
        u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
 
-       if (hotplug_trigger)
-               ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt);
+       ibx_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt);
 
        if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
                int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK_CPT) >>