[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