On Sat, Jun 12, 2010 at 7:21 PM, Andy Lutomirski <l...@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 <l...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx > _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx