diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-08-27 07:08:39 -0700 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-08-27 07:08:39 -0700 | 
| commit | 9db48aaf18d675ac41f550c9384154e0c00de2ef (patch) | |
| tree | 70a19b9164c103e5f52dddff609e01672f8ef616 /drivers/gpu/drm/i915/intel_ringbuffer.c | |
| parent | 0592969e73ae50ce6852d1aff3d222a335289094 (diff) | |
| parent | fea7a08acb13524b47711625eebea40a0ede69a0 (diff) | |
| download | olio-linux-3.10-9db48aaf18d675ac41f550c9384154e0c00de2ef.tar.xz olio-linux-3.10-9db48aaf18d675ac41f550c9384154e0c00de2ef.zip  | |
Merge 3.6-rc3 into driver-core-next
This picks up the printk fixes in 3.6-rc3 that are needed in this branch.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 48 | 
1 files changed, 28 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index bf0195a96d5..e2a73b38abe 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -227,31 +227,36 @@ gen6_render_ring_flush(struct intel_ring_buffer *ring,  	 * number of bits based on the write domains has little performance  	 * impact.  	 */ -	flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; -	flags |= PIPE_CONTROL_TLB_INVALIDATE; -	flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE; -	flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE; -	flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; -	flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; -	flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; -	flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; -	/* -	 * Ensure that any following seqno writes only happen when the render -	 * cache is indeed flushed (but only if the caller actually wants that). -	 */ -	if (flush_domains) +	if (flush_domains) { +		flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; +		flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; +		/* +		 * Ensure that any following seqno writes only happen +		 * when the render cache is indeed flushed. +		 */  		flags |= PIPE_CONTROL_CS_STALL; +	} +	if (invalidate_domains) { +		flags |= PIPE_CONTROL_TLB_INVALIDATE; +		flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE; +		flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE; +		flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; +		flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; +		flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; +		/* +		 * TLB invalidate requires a post-sync write. +		 */ +		flags |= PIPE_CONTROL_QW_WRITE; +	} -	ret = intel_ring_begin(ring, 6); +	ret = intel_ring_begin(ring, 4);  	if (ret)  		return ret; -	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5)); +	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4));  	intel_ring_emit(ring, flags);  	intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); -	intel_ring_emit(ring, 0); /* lower dword */ -	intel_ring_emit(ring, 0); /* uppwer dword */ -	intel_ring_emit(ring, MI_NOOP); +	intel_ring_emit(ring, 0);  	intel_ring_advance(ring);  	return 0; @@ -289,8 +294,6 @@ static int init_ring_common(struct intel_ring_buffer *ring)  	I915_WRITE_HEAD(ring, 0);  	ring->write_tail(ring, 0); -	/* Initialize the ring. */ -	I915_WRITE_START(ring, obj->gtt_offset);  	head = I915_READ_HEAD(ring) & HEAD_ADDR;  	/* G45 ring initialization fails to reset head to zero */ @@ -316,6 +319,11 @@ static int init_ring_common(struct intel_ring_buffer *ring)  		}  	} +	/* Initialize the ring. This must happen _after_ we've cleared the ring +	 * registers with the above sequence (the readback of the HEAD registers +	 * also enforces ordering), otherwise the hw might lose the new ring +	 * register values. */ +	I915_WRITE_START(ring, obj->gtt_offset);  	I915_WRITE_CTL(ring,  			((ring->size - PAGE_SIZE) & RING_NR_PAGES)  			| RING_VALID);  |