diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.h')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 89 | 
1 files changed, 53 insertions, 36 deletions
| diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 525e7d3edda8..d2cd0f1efeed 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h @@ -7,25 +7,33 @@ struct  intel_hw_status_page {  	struct		drm_gem_object *obj;  }; +#define I915_READ_TAIL(ring) I915_READ(RING_TAIL(ring->mmio_base)) +#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL(ring->mmio_base), val) +#define I915_READ_START(ring) I915_READ(RING_START(ring->mmio_base)) +#define I915_WRITE_START(ring, val) I915_WRITE(RING_START(ring->mmio_base), val) +#define I915_READ_HEAD(ring) I915_READ(RING_HEAD(ring->mmio_base)) +#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD(ring->mmio_base), val) +#define I915_READ_CTL(ring) I915_READ(RING_CTL(ring->mmio_base)) +#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL(ring->mmio_base), val) +  struct drm_i915_gem_execbuffer2;  struct  intel_ring_buffer {  	const char	*name; -	struct		ring_regs { -			u32 ctl; -			u32 head; -			u32 tail; -			u32 start; -	} regs; -	unsigned int	ring_flag; +	enum intel_ring_id { +		RING_RENDER = 0x1, +		RING_BSD = 0x2, +		RING_BLT = 0x4, +	} id; +	u32		mmio_base;  	unsigned long	size; -	unsigned int	alignment;  	void		*virtual_start;  	struct		drm_device *dev;  	struct		drm_gem_object *gem_object; -	unsigned int	head; -	unsigned int	tail; -	unsigned int	space; +	u32		actual_head; +	u32		head; +	u32		tail; +	int		space;  	struct intel_hw_status_page status_page;  	u32		irq_gem_seqno;		/* last seq seem at irq time */ @@ -35,35 +43,28 @@ struct  intel_ring_buffer {  			struct intel_ring_buffer *ring);  	void		(*user_irq_put)(struct drm_device *dev,  			struct intel_ring_buffer *ring); -	void		(*setup_status_page)(struct drm_device *dev, -			struct	intel_ring_buffer *ring);  	int		(*init)(struct drm_device *dev,  			struct intel_ring_buffer *ring); -	unsigned int	(*get_head)(struct drm_device *dev, -			struct intel_ring_buffer *ring); -	unsigned int	(*get_tail)(struct drm_device *dev, -			struct intel_ring_buffer *ring); -	unsigned int	(*get_active_head)(struct drm_device *dev, -			struct intel_ring_buffer *ring); -	void		(*advance_ring)(struct drm_device *dev, -			struct intel_ring_buffer *ring); +	void		(*write_tail)(struct drm_device *dev, +				      struct intel_ring_buffer *ring, +				      u32 value);  	void		(*flush)(struct drm_device *dev,  			struct intel_ring_buffer *ring,  			u32	invalidate_domains,  			u32	flush_domains);  	u32		(*add_request)(struct drm_device *dev,  			struct intel_ring_buffer *ring, -			struct drm_file *file_priv,  			u32 flush_domains); -	u32		(*get_gem_seqno)(struct drm_device *dev, -			struct intel_ring_buffer *ring); +	u32		(*get_seqno)(struct drm_device *dev, +				     struct intel_ring_buffer *ring);  	int		(*dispatch_gem_execbuffer)(struct drm_device *dev,  			struct intel_ring_buffer *ring,  			struct drm_i915_gem_execbuffer2 *exec,  			struct drm_clip_rect *cliprects,  			uint64_t exec_offset); +	void		(*cleanup)(struct intel_ring_buffer *ring);  	/**  	 * List of objects currently involved in rendering from the @@ -83,8 +84,24 @@ struct  intel_ring_buffer {  	 */  	struct list_head request_list; +	/** +	 * List of objects currently pending a GPU write flush. +	 * +	 * All elements on this list will belong to either the +	 * active_list or flushing_list, last_rendering_seqno can +	 * be used to differentiate between the two elements. +	 */ +	struct list_head gpu_write_list; + +	/** +	 * Do we have some not yet emitted requests outstanding? +	 */ +	bool outstanding_lazy_request; +  	wait_queue_head_t irq_queue;  	drm_local_map_t map; + +	void *private;  };  static inline u32 @@ -96,15 +113,13 @@ intel_read_status_page(struct intel_ring_buffer *ring,  }  int intel_init_ring_buffer(struct drm_device *dev, -		struct intel_ring_buffer *ring); +			   struct intel_ring_buffer *ring);  void intel_cleanup_ring_buffer(struct drm_device *dev, -		struct intel_ring_buffer *ring); +			       struct intel_ring_buffer *ring);  int intel_wait_ring_buffer(struct drm_device *dev, -		struct intel_ring_buffer *ring, int n); -int intel_wrap_ring_buffer(struct drm_device *dev, -		struct intel_ring_buffer *ring); +			   struct intel_ring_buffer *ring, int n);  void intel_ring_begin(struct drm_device *dev, -		struct intel_ring_buffer *ring, int n); +		      struct intel_ring_buffer *ring, int n);  static inline void intel_ring_emit(struct drm_device *dev,  				   struct intel_ring_buffer *ring, @@ -115,17 +130,19 @@ static inline void intel_ring_emit(struct drm_device *dev,  	ring->tail += 4;  } -void intel_fill_struct(struct drm_device *dev, -		struct intel_ring_buffer *ring, -		void *data, -		unsigned int len);  void intel_ring_advance(struct drm_device *dev,  		struct intel_ring_buffer *ring);  u32 intel_ring_get_seqno(struct drm_device *dev,  		struct intel_ring_buffer *ring); -extern struct intel_ring_buffer render_ring; -extern struct intel_ring_buffer bsd_ring; +int intel_init_render_ring_buffer(struct drm_device *dev); +int intel_init_bsd_ring_buffer(struct drm_device *dev); +int intel_init_blt_ring_buffer(struct drm_device *dev); + +u32 intel_ring_get_active_head(struct drm_device *dev, +			       struct intel_ring_buffer *ring); +void intel_ring_setup_status_page(struct drm_device *dev, +				  struct intel_ring_buffer *ring);  #endif /* _INTEL_RINGBUFFER_H_ */ | 
