On Wed, 6 Mar 2013 20:28:07 +0200 Ville Syrj?l? <ville.syrjala at linux.intel.com> wrote: > On Fri, Mar 01, 2013 at 02:08:31PM -0800, Jesse Barnes wrote: > > We could split this out into a separate routine at some point as an > > optimization. > > BTW did anyone try to gang wakeup thing instead? Not afaik. > > > > > Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org> > > --- > > drivers/gpu/drm/i915/i915_reg.h | 2 ++ > > drivers/gpu/drm/i915/intel_pm.c | 11 ++++++++--- > > 2 files changed, 10 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > > index 1c6e066..558c6d1 100644 > > --- a/drivers/gpu/drm/i915/i915_reg.h > > +++ b/drivers/gpu/drm/i915/i915_reg.h > > @@ -4271,6 +4271,8 @@ > > #define FORCEWAKE 0xA18C > > #define FORCEWAKE_VLV 0x1300b0 > > #define FORCEWAKE_ACK_VLV 0x1300b4 > > +#define FORCEWAKE_MEDIA_VLV 0x1300b8 > > +#define FORCEWAKE_ACK_MEDIA_VLV 0x1300bc > > #define FORCEWAKE_ACK_HSW 0x130044 > > #define FORCEWAKE_ACK 0x130090 > > #define VLV_GTLC_WAKE_CTRL 0x130090 > > diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c > > index 3e976f4..e3947cb 100644 > > --- a/drivers/gpu/drm/i915/intel_pm.c > > +++ b/drivers/gpu/drm/i915/intel_pm.c > > @@ -4423,10 +4423,15 @@ static void vlv_force_wake_get(struct drm_i915_private *dev_priv) > > DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n"); > > > > I915_WRITE_NOTRACE(FORCEWAKE_VLV, _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); > > + I915_WRITE_NOTRACE(FORCEWAKE_MEDIA_VLV, _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); > > > > if (wait_for_atomic((I915_READ_NOTRACE(FORCEWAKE_ACK_VLV) & 1), > > FORCEWAKE_ACK_TIMEOUT_MS)) > > - DRM_ERROR("Timed out waiting for forcewake to ack request.\n"); > > + DRM_ERROR("Timed out waiting for GT to ack forcewake request.\n"); > > + > > + if (wait_for_atomic((I915_READ_NOTRACE(FORCEWAKE_ACK_MEDIA_VLV) & 1), > > + FORCEWAKE_ACK_TIMEOUT_MS)) > > + DRM_ERROR("Timed out waiting for media to ack forcewake request.\n"); > > Based on some of my recent patches the '& 1's should be > '& FORCEWAKE_KERNEL'. And that was based on my misunderstanding of MT forcewake. I thought it was so the BIOS or AMT could do forcewake, but it's actually meant for multiple kernel thread accesses. Since we don't do that, simply using the lowest bit all the time is fine. > > __gen6_gt_wait_for_thread_c0(dev_priv); > > } > > @@ -4434,8 +4439,8 @@ static void vlv_force_wake_get(struct drm_i915_private *dev_priv) > > static void vlv_force_wake_put(struct drm_i915_private *dev_priv) > > { > > I915_WRITE_NOTRACE(FORCEWAKE_VLV, _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL)); > > - /* something from same cacheline, but !FORCEWAKE_VLV */ > > - POSTING_READ(FORCEWAKE_ACK_VLV); > > + I915_WRITE_NOTRACE(FORCEWAKE_MEDIA_VLV, _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL)); > > + /* The below doubles as a POSTING_READ */ > > Are we sure? ;) > > > gen6_gt_check_fifodbg(dev_priv); Well it does a read first thing so I think so. -- Jesse Barnes, Intel Open Source Technology Center