[Intel-gfx] [PATCH] i915: Fix CRT hotplug regression in 2.6.35-rc1

Dave Airlie airlied at gmail.com
Tue Jun 29 01:48:48 CEST 2010


On Sat, Jun 12, 2010 at 7:21 PM, Andy Lutomirski <luto at mit.edu> wrote:
> Commit 7a772c492fcfffae812ffca78a628e76fa57fe58 has two bugs which
> made the hotplug problems on my laptop worse instead of better.
>
> First, it did not, in fact, disable the CRT plug interrupt -- it
> disabled all the other hotplug interrupts.  It seems rather doubtful
> that that bit of the patch fixed anything, so let's just remove it.
> (If you want to add it back, you probably meant ~CRT_HOTPLUG_INT_EN.)
>
> Second, on at least my GM45, setting CRT_HOTPLUG_ACTIVATION_PERIOD_64
> and CRT_HOTPLUG_VOLTAGE_COMPARE_50 (when they were previously unset)
> causes a hotplug interrupt about three seconds later.  The old code
> never restored PORT_HOTPLUG_EN so this could only happen once, but
> they new code restores those registers.  So just set those bits when
> we set up the interrupt in the first place.

ping? Intel guys? ajax? anyone?

We are clearly broken on GM45 at the moment.

Dave.

>
> Signed-off-by: Andy Lutomirski <luto at mit.edu>
> ---
>
> The regression was introduced by the Extra CRT hotplug paranoia patch,
> and it makes 2.6.35-rc2+ as well as 2.6.34 with that patch
> cherry-picked essentially unusable on my X200s / GM45 machine.  Even
> with this fix, there are still hotplug storm issues, but at least
> they're now no worse than they used to be.
>
> Please apply this or something similar to 2.6.35/
>
>  drivers/gpu/drm/i915/i915_irq.c  |   12 +++++++++++-
>  drivers/gpu/drm/i915/i915_reg.h  |    1 -
>  drivers/gpu/drm/i915/intel_crt.c |    6 ------
>  3 files changed, 11 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 864acaa..2199c58 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -1413,8 +1413,18 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
>                        hotplug_en |= SDVOC_HOTPLUG_INT_EN;
>                if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS)
>                        hotplug_en |= SDVOB_HOTPLUG_INT_EN;
> -               if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS)
> +               if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) {
>                        hotplug_en |= CRT_HOTPLUG_INT_EN;
> +
> +                       /* Programming the CRT detection parameters tends
> +                          to generate a spurious hotplug event about three
> +                          seconds later.  So just do it once.
> +                       */
> +                       if (IS_G4X(dev))
> +                               hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
> +                       hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
> +               }
> +
>                /* Ignore TV since it's buggy */
>
>                I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index d31355b..ad0e255 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -1054,7 +1054,6 @@
>  #define CRT_HOTPLUG_DETECT_DELAY_2G            (1 << 4)
>  #define CRT_HOTPLUG_DETECT_VOLTAGE_325MV       (0 << 2)
>  #define CRT_HOTPLUG_DETECT_VOLTAGE_475MV       (1 << 2)
> -#define CRT_HOTPLUG_MASK                       (0x3fc) /* Bits 9-2 */
>
>  #define PORT_HOTPLUG_STAT      0x61114
>  #define   HDMIB_HOTPLUG_INT_STATUS             (1 << 29)
> diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
> index e700ca1..cbe1413 100644
> --- a/drivers/gpu/drm/i915/intel_crt.c
> +++ b/drivers/gpu/drm/i915/intel_crt.c
> @@ -217,14 +217,8 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
>        else
>                tries = 1;
>        hotplug_en = orig = I915_READ(PORT_HOTPLUG_EN);
> -       hotplug_en &= CRT_HOTPLUG_MASK;
>        hotplug_en |= CRT_HOTPLUG_FORCE_DETECT;
>
> -       if (IS_G4X(dev))
> -               hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
> -
> -       hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
> -
>        for (i = 0; i < tries ; i++) {
>                unsigned long timeout;
>                /* turn on the FORCE_DETECT */
> --
> 1.7.0.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>



More information about the Intel-gfx mailing list