[Intel-gfx] [PATCH] drm/i915: Specify bsd rings through exec flag

Gong, Zhipeng zhipeng.gong at intel.com
Wed Aug 6 05:19:38 CEST 2014


> 
> On Tue, Aug 05, 2014 at 03:54:04PM +0800, Zhipeng Gong wrote:
> > On Broadwell GT3 we have 2 Video Command Streamers (VCS), but 
> > userspace has no control when using VCS1 or VCS2. This patch 
> > introduces a mechanism to avoid the default ping-pong mode and use one 
> > specific ring through execution flag.
> > 
> > Signed-off-by: Zhipeng Gong <zhipeng.gong at intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_gem_execbuffer.c | 19 +++++++++++++++++--
> >  include/uapi/drm/i915_drm.h                |  8 +++++++-
> >  2 files changed, 24 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c 
> > b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > index 60998fc..f9ed8e0 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> > @@ -1279,8 +1279,23 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
> >  	else if ((args->flags & I915_EXEC_RING_MASK) == I915_EXEC_BSD) {
> >  		if (HAS_BSD2(dev)) {
> >  			int ring_id;
> > -			ring_id = gen8_dispatch_bsd_ring(dev, file);
> > -			ring = &dev_priv->ring[ring_id];
> > +
> > +			switch (args->flags & I915_EXEC_BSD_MASK) {
> > +			case I915_EXEC_BSD_DEFAULT:
> > +				ring_id = gen8_dispatch_bsd_ring(dev, file);
> > +				ring = &dev_priv->ring[ring_id];
> > +				break;
> > +			case I915_EXEC_BSD_RING1:
> > +				ring = &dev_priv->ring[VCS];
> > +				break;
> > +			case I915_EXEC_BSD_RING2:
> > +				ring = &dev_priv->ring[VCS2];
> > +				break;
> > +			default:
> > +				DRM_DEBUG("execbuf with unknown bsd ring: %d\n",
> > + 					  (int)(args->flags & I915_EXEC_BSD_MASK));
> > +				return -EINVAL;
> > +			}
> >  		} else
> >  			ring = &dev_priv->ring[VCS];
> >  	} else
> > diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h 
> > index ff57f07..421420a 100644
> > --- a/include/uapi/drm/i915_drm.h
> > +++ b/include/uapi/drm/i915_drm.h
> > @@ -736,7 +736,13 @@ struct drm_i915_gem_execbuffer2 {
> >   */
> >  #define I915_EXEC_HANDLE_LUT		(1<<12)
> >  
> > -#define __I915_EXEC_UNKNOWN_FLAGS -(I915_EXEC_HANDLE_LUT<<1)
> > +/** Used for switching BSD rings on the platforms with two BSD rings */
> > +#define I915_EXEC_BSD_MASK		(3<<13)
> > +#define I915_EXEC_BSD_DEFAULT		(0<<13) /* default ping-pong mode */
> > +#define I915_EXEC_BSD_RING1		(1<<13)
> > +#define I915_EXEC_BSD_RING2		(2<<13)
> 
> There is room in the ring selection flags for expansion.
> -Chris

Hi Chris

There is only three rooms in the I915_EXEC_RING_MASK, this feature will
occupy two rooms. If use these rooms, it will left few rooms for more
possible rings in the future and it also introduces a little bit
complexity to get the ring in the i915_do_gem_execbuffer.

-Zhipeng



More information about the Intel-gfx mailing list