diff mbox

drm/i915: remove redundant and partially broken GSE interrupt enable

Message ID 1363078221-18886-1-git-send-email-jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jani Nikula March 12, 2013, 8:50 a.m. UTC
GSE interrupts are always enabled on PCH split platforms, so remove the
redundant enable for ASLE. Moreover, the same interrupt bit was used on all
PCH split platforms, even though the bit definitions changed in IVB, thus
unmasking a reserved bit.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>

---

An alternative to this patch would be keeping GSE interrupts masked until
separately enabled. The question is, when are we ready to handle GSE
interrupts? And if we need to care about that, would the right choice be to
mask the interrupts, or rather tell the BIOS through opregion ARDY/DRDY
fields that we are not ready yet?

I chose the approach in this patch because it's the smallest change towards
being more correct; removing a NOP unmask for ILK+SNB and removing a bogus
unmask for IVB and later.

Let the bikeshedding begin. ;)
---
 drivers/gpu/drm/i915/i915_irq.c |   16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

Comments

Daniel Vetter March 18, 2013, 9 a.m. UTC | #1
On Tue, Mar 12, 2013 at 9:50 AM, Jani Nikula <jani.nikula@intel.com> wrote:
> GSE interrupts are always enabled on PCH split platforms, so remove the
> redundant enable for ASLE. Moreover, the same interrupt bit was used on all
> PCH split platforms, even though the bit definitions changed in IVB, thus
> unmasking a reserved bit.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>
> ---
>
> An alternative to this patch would be keeping GSE interrupts masked until
> separately enabled. The question is, when are we ready to handle GSE
> interrupts? And if we need to care about that, would the right choice be to
> mask the interrupts, or rather tell the BIOS through opregion ARDY/DRDY
> fields that we are not ready yet?
>
> I chose the approach in this patch because it's the smallest change towards
> being more correct; removing a NOP unmask for ILK+SNB and removing a bogus
> unmask for IVB and later.
>
> Let the bikeshedding begin. ;)

Ok, I've read through the entire mess. There's more than just a bit of
fishy here:
- The backlight state isn't protected by locks, despite that we can
change it from a lot of contexts: Through modesets, concurrently
through the backlight interface directly, and in irq context through
asle request. I think we need a spinlock here ...
- We set up the opregion stuff way before enabling interrupts. Which
means we can probably kill all the callers of this, safe for the
postinstall hooks. And there we only need it on the pipestate based
machines, so maybe rename that function.
- intel_opregion_asle_intr and intel_opregion_gse_intr are almost the
same functions, safe that the later has many fewer features. I'm
somewhat hopeful that this might alleviate some of our backlight bugs
on more recent platforms, if we'd bother to implement this. Imo the
right approach would be to pimp the asle callbacks to work on ilk and
then kill the gse_intr. This particular mess goes back to the original
ilk opregion enabling in

commit 01c66889c14aa163c49355b3be2ccfb214500599
Author: Zhao Yakui <yakui.zhao@intel.com>
Date:   Wed Oct 28 05:10:00 2009 +0000

    drm/i915: Add ACPI OpRegion support for Ironlake

There's probably more. Volunteered?

Cheers, Daniel

> ---
>  drivers/gpu/drm/i915/i915_irq.c |   16 +++++++---------
>  1 file changed, 7 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 2139714..ba47ec0 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -98,17 +98,15 @@ void intel_enable_asle(struct drm_device *dev)
>         if (IS_VALLEYVIEW(dev))
>                 return;
>
> +       /* GSE interrupt is always enabled */
> +       if (HAS_PCH_SPLIT(dev))
> +               return;
> +
>         spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
>
> -       if (HAS_PCH_SPLIT(dev))
> -               ironlake_enable_display_irq(dev_priv, DE_GSE);
> -       else {
> -               i915_enable_pipestat(dev_priv, 1,
> -                                    PIPE_LEGACY_BLC_EVENT_ENABLE);
> -               if (INTEL_INFO(dev)->gen >= 4)
> -                       i915_enable_pipestat(dev_priv, 0,
> -                                            PIPE_LEGACY_BLC_EVENT_ENABLE);
> -       }
> +       i915_enable_pipestat(dev_priv, 1, PIPE_LEGACY_BLC_EVENT_ENABLE);
> +       if (INTEL_INFO(dev)->gen >= 4)
> +               i915_enable_pipestat(dev_priv, 0, PIPE_LEGACY_BLC_EVENT_ENABLE);
>
>         spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
>  }
> --
> 1.7.9.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Daniel Vetter March 18, 2013, 9:01 a.m. UTC | #2
On Mon, Mar 18, 2013 at 10:00 AM, Daniel Vetter <daniel@ffwll.ch> wrote:
> On Tue, Mar 12, 2013 at 9:50 AM, Jani Nikula <jani.nikula@intel.com> wrote:
>> GSE interrupts are always enabled on PCH split platforms, so remove the
>> redundant enable for ASLE. Moreover, the same interrupt bit was used on all
>> PCH split platforms, even though the bit definitions changed in IVB, thus
>> unmasking a reserved bit.
>>
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>>
>> ---
>>
>> An alternative to this patch would be keeping GSE interrupts masked until
>> separately enabled. The question is, when are we ready to handle GSE
>> interrupts? And if we need to care about that, would the right choice be to
>> mask the interrupts, or rather tell the BIOS through opregion ARDY/DRDY
>> fields that we are not ready yet?
>>
>> I chose the approach in this patch because it's the smallest change towards
>> being more correct; removing a NOP unmask for ILK+SNB and removing a bogus
>> unmask for IVB and later.
>>
>> Let the bikeshedding begin. ;)
>
> Ok, I've read through the entire mess. There's more than just a bit of
> fishy here:
> - The backlight state isn't protected by locks, despite that we can
> change it from a lot of contexts: Through modesets, concurrently
> through the backlight interface directly, and in irq context through
> asle request. I think we need a spinlock here ...
> - We set up the opregion stuff way before enabling interrupts. Which
> means we can probably kill all the callers of this, safe for the
> postinstall hooks. And there we only need it on the pipestate based
> machines, so maybe rename that function.
> - intel_opregion_asle_intr and intel_opregion_gse_intr are almost the
> same functions, safe that the later has many fewer features. I'm
> somewhat hopeful that this might alleviate some of our backlight bugs
> on more recent platforms, if we'd bother to implement this. Imo the
> right approach would be to pimp the asle callbacks to work on ilk and
> then kill the gse_intr. This particular mess goes back to the original
> ilk opregion enabling in
>
> commit 01c66889c14aa163c49355b3be2ccfb214500599
> Author: Zhao Yakui <yakui.zhao@intel.com>
> Date:   Wed Oct 28 05:10:00 2009 +0000
>
>     drm/i915: Add ACPI OpRegion support for Ironlake
>
> There's probably more. Volunteered?

Also maybe time to extract the backlight stuff into a substruct ...
-Daniel
Daniel Vetter March 18, 2013, 9:09 a.m. UTC | #3
On Mon, Mar 18, 2013 at 10:00 AM, Daniel Vetter <daniel@ffwll.ch> wrote:
> - We set up the opregion stuff way before enabling interrupts. Which
> means we can probably kill all the callers of this, safe for the
> postinstall hooks. And there we only need it on the pipestate based
> machines, so maybe rename that function.

postinstall calls to intel_opregion_enable_asle look superflous, too -
intel_opregion_init will take care of this already. And having
differing enable points on different platforms isn't that great,
either.
-Daniel
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 2139714..ba47ec0 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -98,17 +98,15 @@  void intel_enable_asle(struct drm_device *dev)
 	if (IS_VALLEYVIEW(dev))
 		return;
 
+	/* GSE interrupt is always enabled */
+	if (HAS_PCH_SPLIT(dev))
+		return;
+
 	spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
 
-	if (HAS_PCH_SPLIT(dev))
-		ironlake_enable_display_irq(dev_priv, DE_GSE);
-	else {
-		i915_enable_pipestat(dev_priv, 1,
-				     PIPE_LEGACY_BLC_EVENT_ENABLE);
-		if (INTEL_INFO(dev)->gen >= 4)
-			i915_enable_pipestat(dev_priv, 0,
-					     PIPE_LEGACY_BLC_EVENT_ENABLE);
-	}
+	i915_enable_pipestat(dev_priv, 1, PIPE_LEGACY_BLC_EVENT_ENABLE);
+	if (INTEL_INFO(dev)->gen >= 4)
+		i915_enable_pipestat(dev_priv, 0, PIPE_LEGACY_BLC_EVENT_ENABLE);
 
 	spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
 }