diff mbox

drm/i915: Invariably invalidate before ctx switch

Message ID 1396503023-3114-1-git-send-email-benjamin.widawsky@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ben Widawsky April 3, 2014, 5:30 a.m. UTC
We have been setting the bit which was originally BIOS dependent since:
commit f05bb0c7b624252a5e768287e340e8e45df96e42
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Sun Jan 20 16:33:32 2013 +0000

    drm/i915: GFX_MODE Flush TLB Invalidate Mode must be '1' for scanline waits

Therefore, we do not need to try to figure it out dynamically and we can
just always invalidate the TLBs.

It's a partial revert of:
commit 12b0286f49947a6cdc9285032d918466a8c3f5f9
Author: Ben Widawsky <ben@bwidawsk.net>
Date:   Mon Jun 4 14:42:50 2012 -0700

    drm/i915: possibly invalidate TLB before context switch

The original commit attempted to only invalidate when necessary
(very much a relic from the old days). Now, we can just always invalidate.

I guess the old TODO still exists. Since we seem to have abandoned ILK
contexts however, there isn't much point in even remembering.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
---
 drivers/gpu/drm/i915/i915_gem_context.c | 2 +-
 drivers/gpu/drm/i915/intel_ringbuffer.c | 7 -------
 drivers/gpu/drm/i915/intel_ringbuffer.h | 4 ----
 3 files changed, 1 insertion(+), 12 deletions(-)

Comments

Chris Wilson April 3, 2014, 7:05 a.m. UTC | #1
On Wed, Apr 02, 2014 at 10:30:23PM -0700, Ben Widawsky wrote:
> We have been setting the bit which was originally BIOS dependent since:
> commit f05bb0c7b624252a5e768287e340e8e45df96e42
> Author: Chris Wilson <chris@chris-wilson.co.uk>
> Date:   Sun Jan 20 16:33:32 2013 +0000
> 
>     drm/i915: GFX_MODE Flush TLB Invalidate Mode must be '1' for scanline waits
> 
> Therefore, we do not need to try to figure it out dynamically and we can
> just always invalidate the TLBs.
> 
> It's a partial revert of:
> commit 12b0286f49947a6cdc9285032d918466a8c3f5f9
> Author: Ben Widawsky <ben@bwidawsk.net>
> Date:   Mon Jun 4 14:42:50 2012 -0700
> 
>     drm/i915: possibly invalidate TLB before context switch
> 
> The original commit attempted to only invalidate when necessary
> (very much a relic from the old days). Now, we can just always invalidate.
> 
> I guess the old TODO still exists. Since we seem to have abandoned ILK
> contexts however, there isn't much point in even remembering.
> 
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Signed-off-by: Ben Widawsky <ben@bwidawsk.net>

Seems reasonable, except in most cases (execbuffer) there will be
a following cache-invalidate as part of the move-to-gpu.

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

ILK ctx, never forget.
-Chris
Daniel Vetter April 3, 2014, 9:42 a.m. UTC | #2
On Thu, Apr 03, 2014 at 08:05:35AM +0100, Chris Wilson wrote:
> On Wed, Apr 02, 2014 at 10:30:23PM -0700, Ben Widawsky wrote:
> > We have been setting the bit which was originally BIOS dependent since:
> > commit f05bb0c7b624252a5e768287e340e8e45df96e42
> > Author: Chris Wilson <chris@chris-wilson.co.uk>
> > Date:   Sun Jan 20 16:33:32 2013 +0000
> > 
> >     drm/i915: GFX_MODE Flush TLB Invalidate Mode must be '1' for scanline waits
> > 
> > Therefore, we do not need to try to figure it out dynamically and we can
> > just always invalidate the TLBs.
> > 
> > It's a partial revert of:
> > commit 12b0286f49947a6cdc9285032d918466a8c3f5f9
> > Author: Ben Widawsky <ben@bwidawsk.net>
> > Date:   Mon Jun 4 14:42:50 2012 -0700
> > 
> >     drm/i915: possibly invalidate TLB before context switch
> > 
> > The original commit attempted to only invalidate when necessary
> > (very much a relic from the old days). Now, we can just always invalidate.
> > 
> > I guess the old TODO still exists. Since we seem to have abandoned ILK
> > contexts however, there isn't much point in even remembering.
> > 
> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> 
> Seems reasonable, except in most cases (execbuffer) there will be
> a following cache-invalidate as part of the move-to-gpu.
> 
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

Queued for -next, thanks for the patch.

> ILK ctx, never forget.

Iirc those patches still hang in there ;-)

Cheers, Daniel
Ville Syrjälä April 3, 2014, 10:21 a.m. UTC | #3
On Thu, Apr 03, 2014 at 08:05:35AM +0100, Chris Wilson wrote:
> On Wed, Apr 02, 2014 at 10:30:23PM -0700, Ben Widawsky wrote:
> > We have been setting the bit which was originally BIOS dependent since:
> > commit f05bb0c7b624252a5e768287e340e8e45df96e42
> > Author: Chris Wilson <chris@chris-wilson.co.uk>
> > Date:   Sun Jan 20 16:33:32 2013 +0000
> > 
> >     drm/i915: GFX_MODE Flush TLB Invalidate Mode must be '1' for scanline waits
> > 
> > Therefore, we do not need to try to figure it out dynamically and we can
> > just always invalidate the TLBs.
> > 
> > It's a partial revert of:
> > commit 12b0286f49947a6cdc9285032d918466a8c3f5f9
> > Author: Ben Widawsky <ben@bwidawsk.net>
> > Date:   Mon Jun 4 14:42:50 2012 -0700
> > 
> >     drm/i915: possibly invalidate TLB before context switch
> > 
> > The original commit attempted to only invalidate when necessary
> > (very much a relic from the old days). Now, we can just always invalidate.
> > 
> > I guess the old TODO still exists. Since we seem to have abandoned ILK
> > contexts however, there isn't much point in even remembering.
> > 
> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> 
> Seems reasonable, except in most cases (execbuffer) there will be
> a following cache-invalidate as part of the move-to-gpu.

Except we still move_to_gpu() before the context switch. My fbc related
patch to change that order never got merged.

> 
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
> 
> ILK ctx, never forget.
> -Chris
> 
> -- 
> Chris Wilson, Intel Open Source Technology Centre
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Daniel Vetter April 3, 2014, 3:28 p.m. UTC | #4
On Thu, Apr 03, 2014 at 01:21:38PM +0300, Ville Syrjälä wrote:
> On Thu, Apr 03, 2014 at 08:05:35AM +0100, Chris Wilson wrote:
> > On Wed, Apr 02, 2014 at 10:30:23PM -0700, Ben Widawsky wrote:
> > > We have been setting the bit which was originally BIOS dependent since:
> > > commit f05bb0c7b624252a5e768287e340e8e45df96e42
> > > Author: Chris Wilson <chris@chris-wilson.co.uk>
> > > Date:   Sun Jan 20 16:33:32 2013 +0000
> > > 
> > >     drm/i915: GFX_MODE Flush TLB Invalidate Mode must be '1' for scanline waits
> > > 
> > > Therefore, we do not need to try to figure it out dynamically and we can
> > > just always invalidate the TLBs.
> > > 
> > > It's a partial revert of:
> > > commit 12b0286f49947a6cdc9285032d918466a8c3f5f9
> > > Author: Ben Widawsky <ben@bwidawsk.net>
> > > Date:   Mon Jun 4 14:42:50 2012 -0700
> > > 
> > >     drm/i915: possibly invalidate TLB before context switch
> > > 
> > > The original commit attempted to only invalidate when necessary
> > > (very much a relic from the old days). Now, we can just always invalidate.
> > > 
> > > I guess the old TODO still exists. Since we seem to have abandoned ILK
> > > contexts however, there isn't much point in even remembering.
> > > 
> > > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > > Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> > 
> > Seems reasonable, except in most cases (execbuffer) there will be
> > a following cache-invalidate as part of the move-to-gpu.
> 
> Except we still move_to_gpu() before the context switch. My fbc related
> patch to change that order never got merged.

Hm, pointer to that thing? I guess we need to sign up someone to dig out
all your fbc patches and get them in line in prep for bdw. At least
another opportunity to beat all that into better shape ...
-Daniel
Ville Syrjälä April 4, 2014, 11:46 a.m. UTC | #5
On Thu, Apr 03, 2014 at 05:28:54PM +0200, Daniel Vetter wrote:
> On Thu, Apr 03, 2014 at 01:21:38PM +0300, Ville Syrjälä wrote:
> > On Thu, Apr 03, 2014 at 08:05:35AM +0100, Chris Wilson wrote:
> > > On Wed, Apr 02, 2014 at 10:30:23PM -0700, Ben Widawsky wrote:
> > > > We have been setting the bit which was originally BIOS dependent since:
> > > > commit f05bb0c7b624252a5e768287e340e8e45df96e42
> > > > Author: Chris Wilson <chris@chris-wilson.co.uk>
> > > > Date:   Sun Jan 20 16:33:32 2013 +0000
> > > > 
> > > >     drm/i915: GFX_MODE Flush TLB Invalidate Mode must be '1' for scanline waits
> > > > 
> > > > Therefore, we do not need to try to figure it out dynamically and we can
> > > > just always invalidate the TLBs.
> > > > 
> > > > It's a partial revert of:
> > > > commit 12b0286f49947a6cdc9285032d918466a8c3f5f9
> > > > Author: Ben Widawsky <ben@bwidawsk.net>
> > > > Date:   Mon Jun 4 14:42:50 2012 -0700
> > > > 
> > > >     drm/i915: possibly invalidate TLB before context switch
> > > > 
> > > > The original commit attempted to only invalidate when necessary
> > > > (very much a relic from the old days). Now, we can just always invalidate.
> > > > 
> > > > I guess the old TODO still exists. Since we seem to have abandoned ILK
> > > > contexts however, there isn't much point in even remembering.
> > > > 
> > > > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > > > Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> > > 
> > > Seems reasonable, except in most cases (execbuffer) there will be
> > > a following cache-invalidate as part of the move-to-gpu.
> > 
> > Except we still move_to_gpu() before the context switch. My fbc related
> > patch to change that order never got merged.
> 
> Hm, pointer to that thing?

http://lists.freedesktop.org/archives/intel-gfx/2013-November/036339.html

> I guess we need to sign up someone to dig out
> all your fbc patches and get them in line in prep for bdw. At least
> another opportunity to beat all that into better shape ...

If someone is serious about fixing FBC, I did start reworking the whole
locking mess, but it's sitting somewhere in a branch on my laptop in
half assed state.

The main new idea I had was to compute a "fbc score" for the current crtc
at modeset/setplane time (we hold the appropriate crtc lock here) and
then update/consult those scores under a new fbc lock. This way
almost all of the FBC state is protected by the fbc lock. Whenever we
need to make a decision which pipe gets to use fbc, we grab the lock and
pick the one with the highest score. And as we always reduce the score to
0 before we do anything that requires fbc to be disabled, and only set the
score to anything but 0 only after fbc can be enabled, we don't need to
grab any crtc locks in any fbc specific functions, which is nice.

The main extra complication is that the render tracking stuff still needs
to use struct_mutex as that's what execbuffer uses. And as an extra
complication whenever we decide to enable FBC on a specific plane, we
need to:
1) disable fbc if it's active on another plane. this needs to happen
   before step 2 since we can only do render tracking for one front buffer
   (with the gen7+ nuke mechanism I guess we might be able to track more
   that one actually).
2) enable render tracking for the new front buffer so any
   new rendering to the buffer will invalidate fbc
3) sample the current write seqno and wait for it, as there may
   be rendering already in flight w/o render tracking enabled
   (this is something our current tests fail to exercise
4) do the vblank wait to make sure we don't enable FBC too soon
   after enabling the plane. Alternatively we could keep the fbc score
   at 0 until at least one vblank has passed after the plane has been
   enabled, and then we won't even consider the plane for fbc until it's
   really ready for it
5) finally enable fbc

I've been hoping to find a bit of time and motivation to finish this off.
But so far that's not happened.
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 855ad1e..d4da864 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -596,7 +596,7 @@  mi_set_context(struct intel_ring_buffer *ring,
 	 * explicitly, so we rely on the value at ring init, stored in
 	 * itlb_before_ctx_switch.
 	 */
-	if (IS_GEN6(ring->dev) && ring->itlb_before_ctx_switch) {
+	if (IS_GEN6(ring->dev)) {
 		ret = ring->flush(ring, I915_GEM_GPU_DOMAINS, 0);
 		if (ret)
 			return ret;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 5ceb3c5..218d9cc 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -612,13 +612,6 @@  static int init_render_ring(struct intel_ring_buffer *ring)
 		 */
 		I915_WRITE(CACHE_MODE_0,
 			   _MASKED_BIT_DISABLE(CM0_STC_EVICT_DISABLE_LRA_SNB));
-
-		/* This is not explicitly set for GEN6, so read the register.
-		 * see intel_ring_mi_set_context() for why we care.
-		 * TODO: consider explicitly setting the bit for GEN5
-		 */
-		ring->itlb_before_ctx_switch =
-			!!(I915_READ(GFX_MODE) & GFX_TLB_INVALIDATE_EXPLICIT);
 	}
 
 	if (INTEL_INFO(dev)->gen >= 6)
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 4243fc2..1d04636 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -223,10 +223,6 @@  struct  intel_ring_buffer {
 
 	wait_queue_head_t irq_queue;
 
-	/**
-	 * Do an explicit TLB flush before MI_SET_CONTEXT
-	 */
-	bool itlb_before_ctx_switch;
 	struct i915_hw_context *default_context;
 	struct i915_hw_context *last_context;