[Intel-gfx] [Inter-gfx][PATCH][v3 3/4] drm/i915: add set_tail hook in struct intel_ring_buffer

Xiang, Haihao haihao.xiang at intel.com
Thu Sep 16 07:10:29 CEST 2010


On Thu, 2010-09-16 at 12:21 +0800, Zhenyu Wang wrote:
> On 2010.09.16 10:43:12 +0800, Xiang, Haihao wrote:
> > This is prepared for video codec ring buffer on Sandybridge. It is
> > needed to read/write more than one register to move the tail pointer of
> > the video codec ring on Sandybridge.
> 
> Do we really need new 'set_tail'? Isn't advance_ring used for set ring tail?
> 
> Sandybridge workaround can be put into advance_ring, so your 'set_tail''s only
> left usage is for initialization. Is that workaround even needed for initial
> 0 setting? 
The document says "Every tail move must follow this sequence". I think
it should also include '0'.

> Or can't that be done in init function by using advance_ring?
advance_ring uses ring->tail to set TAIL register, i965_reset() also
invokes ring->init() to re-init ring buffer, how to guarantee ring->tail
is 0? BTW advance_ring can be implemented as set_tail(dev, ring->tail).

> 
> > 
> > Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
> > Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
> > ---
> >  drivers/gpu/drm/i915/intel_ringbuffer.c |   22 +++++++++++++++++-----
> >  drivers/gpu/drm/i915/intel_ringbuffer.h |    2 ++
> >  2 files changed, 19 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> > index a9d4f5b..0a65182 100644
> > --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> > +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> > @@ -134,6 +134,12 @@ static unsigned int render_ring_get_tail(struct drm_device *dev,
> >  	return I915_READ(PRB0_TAIL) & TAIL_ADDR;
> >  }
> >  
> > +static inline void render_ring_set_tail(struct drm_device *dev, u32 value)
> > +{
> > +	drm_i915_private_t *dev_priv = dev->dev_private;
> > +	I915_WRITE(PRB0_TAIL, value);
> > +}
> > +
> >  static unsigned int render_ring_get_active_head(struct drm_device *dev,
> >  		struct intel_ring_buffer *ring)
> >  {
> > @@ -146,8 +152,7 @@ static unsigned int render_ring_get_active_head(struct drm_device *dev,
> >  static void render_ring_advance_ring(struct drm_device *dev,
> >  		struct intel_ring_buffer *ring)
> >  {
> > -	drm_i915_private_t *dev_priv = dev->dev_private;
> > -	I915_WRITE(PRB0_TAIL, ring->tail);
> > +	render_ring_set_tail(dev, ring->tail);
> >  }
> >  
> >  static int init_ring_common(struct drm_device *dev,
> > @@ -161,7 +166,7 @@ static int init_ring_common(struct drm_device *dev,
> >  	/* Stop the ring if it's running. */
> >  	I915_WRITE(ring->regs.ctl, 0);
> >  	I915_WRITE(ring->regs.head, 0);
> > -	I915_WRITE(ring->regs.tail, 0);
> > +	ring->set_tail(dev, 0);
> >  
> >  	/* Initialize the ring. */
> >  	I915_WRITE(ring->regs.start, obj_priv->gtt_offset);
> > @@ -404,6 +409,12 @@ static inline unsigned int bsd_ring_get_tail(struct drm_device *dev,
> >  	return I915_READ(BSD_RING_TAIL) & TAIL_ADDR;
> >  }
> >  
> > +static inline void bsd_ring_set_tail(struct drm_device *dev, u32 value)
> > +{
> > +	drm_i915_private_t *dev_priv = dev->dev_private;
> > +	I915_WRITE(BSD_RING_TAIL, value);
> > +}
> > +
> >  static inline unsigned int bsd_ring_get_active_head(struct drm_device *dev,
> >  		struct intel_ring_buffer *ring)
> >  {
> > @@ -414,8 +425,7 @@ static inline unsigned int bsd_ring_get_active_head(struct drm_device *dev,
> >  static inline void bsd_ring_advance_ring(struct drm_device *dev,
> >  		struct intel_ring_buffer *ring)
> >  {
> > -	drm_i915_private_t *dev_priv = dev->dev_private;
> > -	I915_WRITE(BSD_RING_TAIL, ring->tail);
> > +	bsd_ring_set_tail(dev, ring->tail);
> >  }
> >  
> >  static int init_bsd_ring(struct drm_device *dev,
> > @@ -820,6 +830,7 @@ static struct intel_ring_buffer render_ring = {
> >  	.init			= init_render_ring,
> >  	.get_head		= render_ring_get_head,
> >  	.get_tail		= render_ring_get_tail,
> > +	.set_tail		= render_ring_set_tail,
> >  	.get_active_head	= render_ring_get_active_head,
> >  	.advance_ring		= render_ring_advance_ring,
> >  	.flush			= render_ring_flush,
> > @@ -857,6 +868,7 @@ static struct intel_ring_buffer bsd_ring = {
> >  	.init			= init_bsd_ring,
> >  	.get_head		= bsd_ring_get_head,
> >  	.get_tail		= bsd_ring_get_tail,
> > +	.set_tail		= bsd_ring_set_tail,
> >  	.get_active_head	= bsd_ring_get_active_head,
> >  	.advance_ring		= bsd_ring_advance_ring,
> >  	.flush			= bsd_ring_flush,
> > diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> > index df7acc5..f89e528 100644
> > --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> > +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> > @@ -44,6 +44,8 @@ struct  intel_ring_buffer {
> >  			struct intel_ring_buffer *ring);
> >  	unsigned int	(*get_tail)(struct drm_device *dev,
> >  			struct intel_ring_buffer *ring);
> > +	void		(*set_tail)(struct drm_device *dev,
> > +			u32 value);
> >  	unsigned int	(*get_active_head)(struct drm_device *dev,
> >  			struct intel_ring_buffer *ring);
> >  	void		(*advance_ring)(struct drm_device *dev,
> > -- 
> > 1.7.0.4
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 





More information about the Intel-gfx mailing list