[18/17] drm/i915: Don't call intel_get_hpd_pins() when there's no hotplug interrupt
diff mbox

Message ID 1440791948-18828-1-git-send-email-ville.syrjala@linux.intel.com
State New
Headers show

Commit Message

Ville Syrjala Aug. 28, 2015, 7:59 p.m. UTC
From: Ville Syrjälä <ville.syrjala@linux.intel.com>

On GMCH plaforms we are now getting the following spew on aux
interrupts:
[drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
[drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
[drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
[drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
[drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
[drm:intel_dp_aux_ch] dp_aux_ch timeout status 0x71450064

Prevent it by not calling intel_get_hpd_pins() unless one of the HPD
interrupt bits are actually set.

I already fixed similar annoyance once with
4bca26d0a6518d51a9abe64fbde4b12f04c74053 drm/i915: Use HOTPLUG_INT_STATUS_G4X on VLV/CHV

but another source for it got added in
fd63e2a972c670887e5e8a08440111d3812c0996 drm/i915: combine i9xx_get_hpd_pins and pch_get_hpd_pins

due to pch_get_hpd_pins() being chosen over i9xx_get_hpd_pins() to
serve as the new unified piece of code. pch_get_hpd_pins() had the debug
print, and i9xx_get_hpd_pins() didn't.

Cc: Imre Deak <imre.deak@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_irq.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

Comments

Paulo Zanoni Aug. 28, 2015, 10:15 p.m. UTC | #1
2015-08-28 16:59 GMT-03:00  <ville.syrjala@linux.intel.com>:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> On GMCH plaforms we are now getting the following spew on aux
> interrupts:
> [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> [drm:intel_dp_aux_ch] dp_aux_ch timeout status 0x71450064
>
> Prevent it by not calling intel_get_hpd_pins() unless one of the HPD
> interrupt bits are actually set.
>
> I already fixed similar annoyance once with
> 4bca26d0a6518d51a9abe64fbde4b12f04c74053 drm/i915: Use HOTPLUG_INT_STATUS_G4X on VLV/CHV
>
> but another source for it got added in
> fd63e2a972c670887e5e8a08440111d3812c0996 drm/i915: combine i9xx_get_hpd_pins and pch_get_hpd_pins
>
> due to pch_get_hpd_pins() being chosen over i9xx_get_hpd_pins() to
> serve as the new unified piece of code. pch_get_hpd_pins() had the debug
> print, and i9xx_get_hpd_pins() didn't.
>
> Cc: Imre Deak <imre.deak@intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com>

> ---
>  drivers/gpu/drm/i915/i915_irq.c | 22 ++++++++++++++--------
>  1 file changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 610d301..07e539d 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -1639,20 +1639,26 @@ static void i9xx_hpd_irq_handler(struct drm_device *dev)
>         if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) {
>                 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
>
> -               intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
> -                                  hotplug_trigger, hpd_status_g4x,
> -                                  i9xx_port_hotplug_long_detect);
> -               intel_hpd_irq_handler(dev, pin_mask, long_mask);
> +               if (hotplug_trigger) {
> +                       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
> +                                          hotplug_trigger, hpd_status_g4x,
> +                                          i9xx_port_hotplug_long_detect);
> +
> +                       intel_hpd_irq_handler(dev, pin_mask, long_mask);
> +               }
>
>                 if (hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
>                         dp_aux_irq_handler(dev);
>         } else {
>                 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
>
> -               intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
> -                                  hotplug_trigger, hpd_status_i915,
> -                                  i9xx_port_hotplug_long_detect);
> -               intel_hpd_irq_handler(dev, pin_mask, long_mask);
> +               if (hotplug_trigger) {
> +                       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
> +                                          hotplug_trigger, hpd_status_i915,
> +                                          i9xx_port_hotplug_long_detect);
> +
> +                       intel_hpd_irq_handler(dev, pin_mask, long_mask);
> +               }
>         }
>  }
>
> --
> 2.4.6
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Daniel Vetter Sept. 2, 2015, 3:10 p.m. UTC | #2
On Fri, Aug 28, 2015 at 07:15:15PM -0300, Paulo Zanoni wrote:
> 2015-08-28 16:59 GMT-03:00  <ville.syrjala@linux.intel.com>:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > On GMCH plaforms we are now getting the following spew on aux
> > interrupts:
> > [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> > [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> > [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> > [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> > [drm:intel_get_hpd_pins] hotplug event received, stat 0x00000000, dig 0x00000000, pins 0x00000000
> > [drm:intel_dp_aux_ch] dp_aux_ch timeout status 0x71450064
> >
> > Prevent it by not calling intel_get_hpd_pins() unless one of the HPD
> > interrupt bits are actually set.
> >
> > I already fixed similar annoyance once with
> > 4bca26d0a6518d51a9abe64fbde4b12f04c74053 drm/i915: Use HOTPLUG_INT_STATUS_G4X on VLV/CHV
> >
> > but another source for it got added in
> > fd63e2a972c670887e5e8a08440111d3812c0996 drm/i915: combine i9xx_get_hpd_pins and pch_get_hpd_pins
> >
> > due to pch_get_hpd_pins() being chosen over i9xx_get_hpd_pins() to
> > serve as the new unified piece of code. pch_get_hpd_pins() had the debug
> > print, and i9xx_get_hpd_pins() didn't.
> >
> > Cc: Imre Deak <imre.deak@intel.com>
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com>

All applied to dinq except for one patch that Jani picked up to -fixes.
-Daniel

> 
> > ---
> >  drivers/gpu/drm/i915/i915_irq.c | 22 ++++++++++++++--------
> >  1 file changed, 14 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> > index 610d301..07e539d 100644
> > --- a/drivers/gpu/drm/i915/i915_irq.c
> > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > @@ -1639,20 +1639,26 @@ static void i9xx_hpd_irq_handler(struct drm_device *dev)
> >         if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) {
> >                 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
> >
> > -               intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
> > -                                  hotplug_trigger, hpd_status_g4x,
> > -                                  i9xx_port_hotplug_long_detect);
> > -               intel_hpd_irq_handler(dev, pin_mask, long_mask);
> > +               if (hotplug_trigger) {
> > +                       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
> > +                                          hotplug_trigger, hpd_status_g4x,
> > +                                          i9xx_port_hotplug_long_detect);
> > +
> > +                       intel_hpd_irq_handler(dev, pin_mask, long_mask);
> > +               }
> >
> >                 if (hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
> >                         dp_aux_irq_handler(dev);
> >         } else {
> >                 u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
> >
> > -               intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
> > -                                  hotplug_trigger, hpd_status_i915,
> > -                                  i9xx_port_hotplug_long_detect);
> > -               intel_hpd_irq_handler(dev, pin_mask, long_mask);
> > +               if (hotplug_trigger) {
> > +                       intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
> > +                                          hotplug_trigger, hpd_status_i915,
> > +                                          i9xx_port_hotplug_long_detect);
> > +
> > +                       intel_hpd_irq_handler(dev, pin_mask, long_mask);
> > +               }
> >         }
> >  }
> >
> > --
> > 2.4.6
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> 
> 
> -- 
> Paulo Zanoni
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Patch
diff mbox

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 610d301..07e539d 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1639,20 +1639,26 @@  static void i9xx_hpd_irq_handler(struct drm_device *dev)
 	if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) {
 		u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
 
-		intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
-				   hotplug_trigger, hpd_status_g4x,
-				   i9xx_port_hotplug_long_detect);
-		intel_hpd_irq_handler(dev, pin_mask, long_mask);
+		if (hotplug_trigger) {
+			intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
+					   hotplug_trigger, hpd_status_g4x,
+					   i9xx_port_hotplug_long_detect);
+
+			intel_hpd_irq_handler(dev, pin_mask, long_mask);
+		}
 
 		if (hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
 			dp_aux_irq_handler(dev);
 	} else {
 		u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
 
-		intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
-				   hotplug_trigger, hpd_status_i915,
-				   i9xx_port_hotplug_long_detect);
-		intel_hpd_irq_handler(dev, pin_mask, long_mask);
+		if (hotplug_trigger) {
+			intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger,
+					   hotplug_trigger, hpd_status_i915,
+					   i9xx_port_hotplug_long_detect);
+
+			intel_hpd_irq_handler(dev, pin_mask, long_mask);
+		}
 	}
 }