At Thu, 15 Nov 2012 21:07:33 +0100, Daniel Vetter wrote: > > On Thu, Nov 15, 2012 at 6:03 PM, Takashi Iwai <tiwai at suse.de> wrote: > > Some IVB machines seem to need non-MT forcewake. Using MT forcewake > > on such machines result in broken or blank screens. > > > > Signed-off-by: Takashi Iwai <tiwai at suse.de> > > --- > > The commit 36ec8f877481449bdfa072e6adf2060869e2b970 triggered a > > regression on my test IVY laptops. Instead of reverting the commit, > > I cooked a bit to make fitting only for IS_IVYBRIDGE(). > > Hm, that's rather bad since proper usage of DERRMR requires that we > enable rc6 on ivb, which is only really possible when we have > multi-threaded forcewake. Hm, so just disabling RC6 doesn't suffice? > Now I've thought that all production > machines have that enabled (it's something the bios should do), so the > big question: Is this a pre-production hw? If so, a bios upgrade > should fix it since historically we've killed pre-production > workarounds once the real hw ships, there are simply too many ... Indeed a machine showing the issue is a prototype machine, but it's a product-ready unit, so I don't think CPU/GPU is different from the same model in the market. Though, the BIOS version on that machine is fairly old, so of course this can be the cause. But still I feel uneasy that the bug depends on BIOS version, not the hardware. In anyway, I'll check other IVB models whether this problem is present. thanks, Takashi > -Daniel > > > > > > drivers/gpu/drm/i915/intel_pm.c | 29 ++++++++++++++++++++++++++++- > > 1 file changed, 28 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c > > index 0cbc0e6..944911e 100644 > > --- a/drivers/gpu/drm/i915/intel_pm.c > > +++ b/drivers/gpu/drm/i915/intel_pm.c > > @@ -4239,9 +4239,36 @@ void intel_gt_init(struct drm_device *dev) > > if (IS_VALLEYVIEW(dev)) { > > dev_priv->gt.force_wake_get = vlv_force_wake_get; > > dev_priv->gt.force_wake_put = vlv_force_wake_put; > > - } else if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) { > > + } else if (IS_HASWELL(dev)) { > > dev_priv->gt.force_wake_get = __gen6_gt_force_wake_mt_get; > > dev_priv->gt.force_wake_put = __gen6_gt_force_wake_mt_put; > > + } else if (IS_IVYBRIDGE(dev)) { > > + /* IVB configs may use multi-threaded forcewake */ > > + u32 ecobus; > > + > > + /* A small trick here - if the bios hasn't configured > > + * MT forcewake, and if the device is in RC6, then > > + * force_wake_mt_get will not wake the device and the > > + * ECOBUS read will return zero. Which will be > > + * (correctly) interpreted by the test below as MT > > + * forcewake being disabled. > > + */ > > + mutex_lock(&dev->struct_mutex); > > + __gen6_gt_force_wake_mt_get(dev_priv); > > + ecobus = I915_READ_NOTRACE(ECOBUS); > > + __gen6_gt_force_wake_mt_put(dev_priv); > > + mutex_unlock(&dev->struct_mutex); > > + > > + if (ecobus & FORCEWAKE_MT_ENABLE) { > > + DRM_DEBUG_KMS("Using MT version of forcewake\n"); > > + dev_priv->gt.force_wake_get = > > + __gen6_gt_force_wake_mt_get; > > + dev_priv->gt.force_wake_put = > > + __gen6_gt_force_wake_mt_put; > > + } else { > > + dev_priv->gt.force_wake_get = __gen6_gt_force_wake_get; > > + dev_priv->gt.force_wake_put = __gen6_gt_force_wake_put; > > + } > > } else if (IS_GEN6(dev)) { > > dev_priv->gt.force_wake_get = __gen6_gt_force_wake_get; > > dev_priv->gt.force_wake_put = __gen6_gt_force_wake_put; > > -- > > 1.8.0 > > > > > > -- > Daniel Vetter > Software Engineer, Intel Corporation > +41 (0) 79 365 57 48 - http://blog.ffwll.ch >